3

カスタムリストビューで右スワイプでボタンを表示するように実装しようとしています。私が今直面している問題は、オンラインで見つけた 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>

もう1つ質問を追加します。ビューの合計カウントを取得します。でも違うレイアウトで表示したい。これが私の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());



}
4

1 に答える 1

1

したがって、これは私が見ているように2つの方法で実行できます。

  1. リスト全体でスワイプを聞いて、スワイプが発生した行を特定し、正しい行のボタンを表示/非表示にします。
  2. 各行のスワイプを聞いて、その行のボタンを表示/非表示にします。

現在、リストにリスナーを設定していますが、アダプターに接続されているボタンの表示/非表示を適用しようとしています。ある意味では、各ソリューションの半分を実行しています。あなたが持っているもので、オプション#2を使用することをお勧めします.

では、行レイアウトTransactionAddDropViewHolderのルートへの参照を取得する必要があるため、をそれに設定できます。ViewOnSwipeTouchListener

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(); 
    }
}

もう 1 つ問題があります。スワイプするとボタンが正しく表示されますが、ユーザーがスクロールを続けると、他の行に表示されます。これは、 がListViewその行の をリサイクルするためViewです。次の 2 つのいずれかを行うことをお勧めします。

  1. ボタンが表示された後にユーザーが再びスクロールを開始すると、ボタンは再び非表示になります。これは、リストの「スワイプして削除」で iOS が行うことです。
  2. booleanたとえば、行がボタンが表示されるモードの場合は、データ オブジェクトに格納するためにa を使用しますisDeleteShowing。次に、onSwipe コールバックで、isDeleteShowingtrue/false に設定します。最後に、そのデータ行getViewに応じてボタンを表示/非表示にします。isDeleteShowing

これがすべて役立つことを願っています。

于 2013-04-25T16:55:19.630 に答える