Проведите пальцем вправо по экранной кнопке в пользовательском представлении списка Android

Я пытаюсь реализовать, показать кнопку при пролистывании прямо в пользовательском представлении списка. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я реализовал onSwipeTouchListener, который нашел в Интернете. Я мог видеть кнопку смахивания. Но это непоследовательно, я имею в виду, что если я прокручиваю вправо по одной строке, кнопка отображается в какой-то другой строке. Это то, что я пробовал.

я создал адаптер для хранения представления

//TransactionAddDropViewHolder


        public static final class TransactionAddDropViewHolder {

    public View moveUpButton = null;
    public View moveDownButton = null;
    public View withdrawButton = null;
    public View reviewButton = null;

    public View approveButton = null;
    public View rejectButton = null;

    public LinearLayout addContainer = null;
    public LinearLayout dropContainer = null;



    public void swipeButtons() {
        addDropListView.setOnTouchListener(new OnSwipeTouchListener() {

            public void onSwipeRight() {
                withdrawButton.setVisibility(View.VISIBLE);
            }

            public void onSwipeLeft() {
                withdrawButton.setVisibility(View.INVISIBLE);
            }
        });
    }

    public void showUserButtons() {
        this.moveUpButton.setVisibility(View.VISIBLE);
        this.moveDownButton.setVisibility(View.VISIBLE);
        // this.withdrawButton.setVisibility(View.VISIBLE);
    }

    public void hideUserButtons() {
        this.moveUpButton.setVisibility(View.GONE);
        this.moveDownButton.setVisibility(View.GONE);
        // this.withdrawButton.setVisibility(View.GONE);
    } 

}

И это мой пользовательский вид, в котором я показываю onSwipeButton

@Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {

        final TransactionAddDrop addDropData = this.addDropList.get(position);

        TransactionAddDropViewHolder holder = null;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.fragment_pending_transaction_list_item, null);
            holder = new TransactionAddDropViewHolder();

holder.withdrawButton = convertView.findViewById(R.id.pendingTransactionItem_withdrawButton);
            holder.addContainer = (LinearLayout) convertView.findViewById(R.id.pendingTransactionItem_addContainer);
            **holder.swipeButtons();** 
            convertView.setTag(holder);
        } else {
            holder = (TransactionAddDropViewHolder) convertView.getTag();
            holder.swipeButtons(); 
        }

И это мой класс OnSwipeTouchListener

    private final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        onSwipeRight();
                    } else {
                        onSwipeLeft();
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                }
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
}

Добавление макета XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.cbssports.nflapp.ffb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/swipeRight"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/claimlayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <LinearLayout
        android:id="@+id/claim"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp" >

        <com.cbssports.nflapp.ffb.CustomText
            android:id="@+id/claimNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="1"
            android:textColor="#B4B4B5"
            android:textSize="36dp"
            app:typeface="oswald_regular" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/pendingPlayers"
        android:layout_width="200dp"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/tradeDate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:orientation="horizontal"
            android:layout_toRightOf="@+id/claimlayout"
            android:paddingTop="5dp" >

            <com.cbssports.nflapp.ffb.CustomText
                android:id="@+id/pendingTransactionItem_teamName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#B4B4B5"
                android:textSize="9dp"
                app:typeface="oswald_regular" />

            <com.cbssports.nflapp.ffb.CustomText
                android:id="@+id/pendingTransactionItem_bidAmount"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="#797979"
                android:text=""
                android:textColor="#ffffff"
                android:textSize="9dp" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/adddropView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tradeDate"
            android:layout_toRightOf="@+id/claimlayout"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/addViewContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <com.cbssports.nflapp.ffb.CustomText
                    android:layout_width="50dp"
                    android:layout_height="wrap_content"
                    android:paddingRight="10dp"
                    android:text="ADD"
                    android:textColor="#797979"
                    android:textSize="15dp"
                    app:typeface="oswald_regular" />

                <LinearLayout
                    android:id="@+id/pendingTransactionItem_addContainer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/adddropViewContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/claimlayout"
                android:orientation="horizontal" >

                <com.cbssports.nflapp.ffb.CustomText
                    android:layout_width="50dp"
                    android:layout_height="wrap_content"
                    android:paddingRight="10dp"
                    android:text="DROP"
                    android:textColor="#797979"
                    android:textSize="15dp"
                    app:typeface="oswald_regular" />

                <LinearLayout
                    android:id="@+id/pendingTransactionItem_dropContainer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/pendingTransactionItem_userButtonContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_gravity="center_vertical"
        android:layout_toRightOf="@+id/pendingPlayers"
        android:gravity="center"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/pendingTransactionItem_moveUpButton"
                android:layout_width="20dp"
                android:layout_height="15dp"
                android:layout_margin="3dp"
                android:background="@drawable/gfx_up_arrow"
                android:padding="1dp"
                android:textColor="#ffffff"
                android:textSize="7sp"
                android:visibility="visible" />

            <Button
                android:id="@+id/pendingTransactionItem_moveDownButton"
                android:layout_width="20dp"
                android:layout_height="15dp"
                android:layout_margin="3dp"
                android:background="@drawable/gfx_down_arrow"
                android:padding="1dp"
                android:textColor="#ffffff"
                android:textSize="7sp"
                android:visibility="visible" />
        </LinearLayout>

        <ImageView
            android:id="@+id/pendingTransactionItem_withdrawButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="1dp"
            android:src="@drawable/ic_cancelclaim"
            android:visibility="gone" />

        <!-- Transaction Review -->

        <ImageView
            android:id="@+id/pendingTransactionItem_reviewButton"
            android:layout_width="38dp"
            android:layout_height="38dp"
            android:padding="1dp"
            android:src="@drawable/btn_review"
            android:visibility="gone" />
    </LinearLayout>
</LinearLayout>

Adding one more question. getting the total Count of the view. But want to display in the different layout. Here is my onCreatedView

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    fragmentPendingTrades = inflater.inflate(R.layout.fragment_transactions_pending, container, false);
    pendingTradesView = inflater;

    return fragmentPendingTrades;
}

    public void onViewCreated(final View view, final Bundle savedInstanceState) {

    this.addDropListView = (ListView) view.findViewById(R.id.transactions_pending_transactionsListView);
    this.addDropAdapter = new TransactionAddDropAdapter(pendingTradesView);
    this.addDropListView.setAdapter(this.addDropAdapter);
    this.emptyTransationsContainer = view.findViewById(R.id.transactions_pending_transactions_emptyContainer);



    TextView getTotalCount = (TextView) view.findViewById(R.id.transactions_pending_TransactionsAddDropCount);

    getTotalCount.setText(""+addDropListView.getCount());



}

person dhiku    schedule 25.04.2013    source источник
comment
Я вижу вашу проблему (их больше одной), но мне нужна дополнительная информация, опубликуйте код, который назначает withdrawButton и весь класс TransactionAddDropViewHolder.   -  person Steven Byle    schedule 25.04.2013
comment
Привет Стивен, Спасибо за ответ. Я только что обновил класс TransactionAddDropViewHolder в вопросе.   -  person dhiku    schedule 25.04.2013
comment
Я до сих пор не вижу, где holder.withdrawButton назначается с помощью findViewById. Вы пропускаете какой-то код из своего метода getView?   -  person Steven Byle    schedule 25.04.2013
comment
Привет, извините, пропустил эту строку в getView. Теперь добавил кнопку вывода   -  person dhiku    schedule 25.04.2013
comment
Хорошо, последнее, что мне нужно увидеть, можете ли вы опубликовать xml для R.layout.fragment_pending_transaction_list_item?   -  person Steven Byle    schedule 25.04.2013
comment
Добавлен макет XML в вопрос. Спасибо   -  person dhiku    schedule 25.04.2013
comment
привет... не могли бы вы мне помочь?   -  person Anjali Tripathi    schedule 21.01.2015
comment
Пожалуйста, предоставьте мне эту ссылку для реализации считывания?   -  person Anjali Tripathi    schedule 21.01.2015


Ответы (1)


Итак, это можно сделать двумя способами, как я это вижу:

  1. Слушайте свайпы по всему списку, выясняйте, в какой строке произошел свайп, и показывайте/скрывайте кнопку для нужной строки.
  2. Слушайте свайпы в каждой строке и показывайте/скрывайте кнопку для этой строки.

Прямо сейчас вы устанавливаете прослушиватель в списке, но пытаетесь применить отображение/скрытие кнопки, прикрепленной к адаптеру. В некотором смысле, вы делаете половину каждого решения. С тем, что у вас есть, я предлагаю вам выбрать вариант № 2.

В вашем TransactionAddDropViewHolder вам нужно получить ссылку на корень View в макете строки, чтобы мы могли установить для него OnSwipeTouchListener.

public static final class TransactionAddDropViewHolder {

    public View rootView = null;

    // Your other code

    public void swipeButtons() {
        rootView.setOnTouchListener(new OnSwipeTouchListener() {

            public void onSwipeRight() {
                withdrawButton.setVisibility(View.VISIBLE);
            }

            public void onSwipeLeft() {
                withdrawButton.setVisibility(View.INVISIBLE);
            }
        });
    }

    // Your other code

}

Затем в вашем методе getView обновите его, чтобы ваш TransactionAddDropViewHolder получил ссылку на корень View в макете.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    final TransactionAddDrop addDropData = this.addDropList.get(position);

    TransactionAddDropViewHolder holder = null;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.fragment_pending_transaction_list_item, null);
        holder = new TransactionAddDropViewHolder();

        // Get a reference to the root of the row layout
        holder.rootView = convertView.findViewById(R.id.swipeRight); 

        holder.withdrawButton = convertView.findViewById(R.id.pendingTransactionItem_withdrawButton);
        holder.addContainer = (LinearLayout) convertView.findViewById(R.id.pendingTransactionItem_addContainer);

        holder.swipeButtons();
        convertView.setTag(holder);
    } else {
        holder = (TransactionAddDropViewHolder) convertView.getTag();
        holder.swipeButtons(); 
    }
}

У вас будет еще одна проблема: кнопка будет правильно отображаться при прокрутке, но если пользователь продолжит прокрутку, она появится в других строках. Это связано с тем, что ListView повторно использует Views своей строки. Я предлагаю вам сделать 2 вещи:

  1. Когда пользователь снова начинает прокручивать страницу после появления кнопки, вы снова ее скрываете. Это то, что iOS делает с «пролистыванием для удаления» в списках.
  2. Используйте boolean для сохранения в вашем объекте данных, если строка находится в режиме, в котором кнопка видна, например, isDeleteShowing. Затем в ваших обратных вызовах onSwipe вы устанавливаете isDeleteShowing в true/false. Наконец, в вашем getView вы показываете/скрываете кнопку там в зависимости от isDeleteShowing для этой строки данных.

Надеюсь, это все поможет.

person Steven Byle    schedule 25.04.2013
comment
Привет, Стивен, это здорово... это работает... еще один быстрый вопрос. Он отлично работает для просмотра. Но это не последовательно. Как в жесте. Когда я прокручиваю вправо, это работает, но большую часть времени мне приходится проводить три раза. А для свайпа влево приходится делать скорее всего 6 раз. Это то, что я должен изменить порог? Спасибо - person dhiku; 25.04.2013
comment
Я думаю, что может случиться то, что ваш палец может не оставаться внутри строки в течение всего смахивания. Если ваши строки тонкие, а ваши сенсорные координаты выходят за границы строк, распознавание жестов останавливается там, где вы выходите за границы, что обычно приводит к тому, что смахивание не видно. Я не уверен, как вы можете исправить это, кроме как сделать ваши строки толще. Однако, если вы переключитесь на вариант № 1, вы можете проверить, где начинается и заканчивается жест, если он находится в той же строке, тогда инициируйте смахивание. Конечно, это требует от вас переделки некоторого кода. - person Steven Byle; 25.04.2013
comment
Спасибо. Я проверю этот... Еще один последний вопрос. о получении общего количества просмотров в другом макете. Я хочу напечатать totalCount строки и хочу отобразить в другом макете. Пожалуйста, смотрите обновленный вопрос в конце. Спасибо. - person dhiku; 26.04.2013
comment
Поскольку это другой вопрос, который вы добавили, и на него был дан ответ, создайте новый вопрос. - person Steven Byle; 26.04.2013
comment
Привет, Стивен. Извините, что снова пришел к этому вопросу. Я пытаюсь сбросить вид кнопки при прокрутке. Я не получаю должным образом. Можете ли вы помочь мне спасибо. - person dhiku; 28.04.2013
comment
Я предлагаю вам создать новый вопрос, так как это другая проблема. - person Steven Byle; 29.04.2013
comment
Спасибо, Стивен, вот мой вопрос для пользовательского представления android"> stackoverflow.com/questions/16268200/ - person dhiku; 29.04.2013