2013-04-25 92 views
3

我正試圖實現在自定義列表視圖中向右滑動顯示按鈕。我現在面臨的問題是,我實現了我在網上找到的onSwipeTouchListener。我可以看到滑動按鈕。但它不一致,我的意思是如果我向右滑動一行,按鈕顯示在其他行。這是我的嘗試。在Android自定義列表視圖中滑動右側顯示按鈕

我創建了一個適配器,用於保存視圖

//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> 

添加一個問題。獲取視圖的總數。但要顯示在不同的佈局。這裏是我的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()); 



} 
+0

我看到你的問題(有多個),但需要更多的信息,發佈代碼,分配'withdrawButton'和整個'TransactionAddDropViewHolder'類。 – 2013-04-25 15:43:21

+0

嗨史蒂文,感謝您的答覆。我剛更新了問題中的TransactionAddDropViewHolder類。 – dhiku 2013-04-25 15:49:44

+0

我仍然沒有看到'holder.withdrawButton'是用'findViewById'分配的。你是否省略了'getView'方法的一些代碼? – 2013-04-25 16:00:40

回答

1

所以,這是可以做到2種方式,因爲我看到它:

  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回收其行View s。我建議你做2件事:

  1. 當用戶在按鈕出現後再次開始滾動時,您再次隱藏它。這是iOS在列表中用「輕掃刪除」的功能。
  2. 使用boolean來存儲數據對象,如果該行處於按鈕可見的模式,例如isDeleteShowing。然後在您的onSwipe回調中,您將isDeleteShowing設置爲true/false。最後,在您的getView中,您將顯示/隱藏該按鈕,具體取決於該數據行的isDeleteShowing

希望這一切都有所幫助。

+0

嗨史蒂文,這真棒...它的作品...只是一個更快的問題。它適用於視圖。但它不一致。就像在手勢中一樣。當我向右滑動時,它可以正常工作,但大部分時間我都要刷三次。而對於左手滑動,我必須做6次。那是我必須改變的門檻嗎?謝謝 – dhiku 2013-04-25 18:51:43

+0

我認爲可能發生的情況是您的手指在整個滑動過程中可能不會留在行內。如果你的行很細,並且你的觸摸座標位於行邊界之上或之下,那麼手勢識別將在你超出邊界的地方停止,通常導致不會看到滑動。我不確定如何解決這個問題,而不是讓你的行更粗。但是,如果切換到選項#1,則可以檢查手勢開始和結束的位置,如果它位於同一行中,則觸發滑動。當然,這需要你重新編寫一些代碼。 – 2013-04-25 19:13:48

+0

謝謝。我會檢查那一個...還有一個最後的問題。關於在不同的佈局中獲取視圖的總數。我想打印該行的totalCount並希望以不同的佈局顯示。最後請看最新的問題。謝謝。 – dhiku 2013-04-25 22:33:07

相關問題