2015-06-16 14 views
11

Tôi đã sử dụng SwipeableRecyclerView cho ứng dụng Android của mình để bật swipes cho recyclerView của tôi. RecyclerView chứa danh sách các cardView.RecyclerView.getChild (chỉ mục) hiển thị rỗng khi danh sách được cuộn (chỉ mục bị rối loạn)

Tôi đã cố gắng để thực hiện chức năng undo đối với thẻ đó sẽ được xóa khi vuốt sang trái (swipe đầu tiên chương trình undo, swipe tiếp theo gây nên xóa)

tôi đang cố gắng đoạn mã sau (một phần làm việc tôi đoán)

SwipeableRecyclerViewTouchListener srvTouchListner = new SwipeableRecyclerViewTouchListener(rvTimerList, 
      new SwipeableRecyclerViewTouchListener.SwipeListener(){ 

       @Override 
       public boolean canSwipe(int i) { 
        return true; 
       } 

       @Override 
       public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] ints) { 
        for(int position : ints){ 
         View view = recyclerView.getChildAt(position); 
          if (view.getTag(R.string.card_undo) == null) { 
           if(viewStack == null) { 
            saveToViewStack(position, view); 
            final ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.time_card2); 
            view.setTag(R.string.card_undo, "true"); 
            viewGroup.addView(view.inflate(TimerSummary.this, R.layout.timeslot_card_undo, null)); 
           } 
          } else { 
           Log.d(TAG, "Removing Item"); 
           deleteTimeSlot(timerInstanceList.get(position)); 
           Toast.makeText(TimerSummary.this, "Deleted!", Toast.LENGTH_SHORT).show(); 
           timerInstanceList.remove(position); 
           finalSummaryAdapter.notifyItemRemoved(position); 
          } 

        } 
        finalSummaryAdapter.notifyDataSetChanged(); 
       } 
       @Override 
       public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] ints) { 
        for (int position:ints){ 
         View view = recyclerView.getChildAt(position); 
         if(view.getTag(R.string.card_undo) != null && view.getTag(R.string.card_undo).equals("true")){ 
          viewStack = null; 
          recyclerView.setAdapter(finalSummaryAdapter); 
         } 
        } 

       } 
      }); 

khi Items có nhiều (nhu cầu di chuyển)

View view = recyclerView.getChildAt(position); 

trả về một tham chiếu null gây một vụ tai nạn ứng dụng.

Tôi nghi ngờ rằng tôi đang sử dụng phương pháp sai để xem. Tôi nên sử dụng một cái gì đó liên quan với người xem, tôi thực sự loại nhầm lẫn về làm thế nào để có được xem mà bạn muốn từ người xem.

Nếu bất kỳ ai cũng có thể chia sẻ mọi thứ giúp ích, điều đó thật tuyệt vời! Tôi rất sẵn lòng cung cấp thêm bất kỳ thông tin nào nếu ai đó muốn,

Trả lời

17

Bạn nên sử dụng findViewHolderForAdapterPosition. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)

Hãy nhớ rằng nó sẽ trả về giá trị rỗng nếu vị trí không được đặt ra (ví dụ: ngoài giới hạn hoặc bị xóa).

+1

Làm cách nào để truy cập mọi chế độ xem từ trình xem này, Tôi có thể thay đổi bố cục và tăng bố cục mới không? –

+0

Dù sao tôi đang sử dụng một cardview được ẩn lúc đầu để hiển thị onlly khi người dùng cố gắng để xóa một mục, Bằng cách đó tôi có thể thoát khỏi mess tạo ra khi tôi cố gắng truy cập các quan điểm trực tiếp từ recyclerView.Điều này là một trong những hoạt động tốt, tôi sẽ sử dụng khái niệm này cho đến khi tôi có thể có quan điểm prooperly từ recyclerView –

+0

@yigit Bạn có thể xây dựng thêm một chút? Bạn nói bạn "nên sử dụng ...". Đây có phải là hành vi dự kiến ​​hoặc lỗi không? (tại sao?). Tôi thấy RecyclerView là một chế độ xem có thể cuộn được, do đó, điều này hơi lạ nếu bạn hỏi tôi. – GMan

8

Vì tôi không có đủ điểm danh tiếng để nhận xét về câu trả lời của @ yigit, tôi nghĩ tôi sẽ đưa ra một cách để truy xuất tất cả viewHolders từ RecyclerView bất kể những gì hiện có trong viewGroup. Ngay cả với findViewHolderForAdapterPosition và ForLayoutPosition, chúng ta vẫn có thể nhận được một thể hiện null của ViewHolder trong RecyclerView.

Để phá vỡ này, chúng ta có thể sử dụng findViewHolderForItemId [] và vượt qua ID của viewHolder trong adapter sử dụng RecyclerView.Adapter # getItemId (int position) []

for (int i = 0; i < mAdapter.getItemCount(); i++) { 
    RecyclerView.ViewHolder holder = 
      mRecyclerView.findViewHolderForItemId(mAdapter.getItemId(i)); 
} 
  1. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForItemId(int)
  2. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemId(int)
+0

Đây là một câu trả lời thú vị. Tôi đã thử nó và thấy rằng findViewHolderForItemId (int) chỉ muốn một vị trí int, không phải là dài mà getItemId (int) trả về. – Gi0rgi0s

0

Sử dụng f phương thức findFastCompletelyVisibleItemPosition() & findLastVisibleItemPosition() trên LayoutManager của RecyclerView của bạn để tìm ra rằng con bạn đang tìm kiếm có thể nhìn thấy hay không. Nếu nó có thể nhìn thấy thì bạn có thể sử dụng getChild (index) để có được cá thể ViewHolder của đứa trẻ cụ thể đó và nó sẽ không rỗng nếu nó có thể null (Nếu đứa trẻ không có trong đó). Trong trường hợp con bạn không hiển thị, bạn chỉ cần thực hiện các thay đổi trong đối tượng Danh sách vị trí cụ thể của bạn, lần tiếp theo bất cứ khi nào nó sẽ hiển thị sẽ có giao diện người dùng được cập nhật.

if (selectedPosition >= linearLayoutManager.findFirstVisibleItemPosition() 
        && selectedPosition <= linearLayoutManager.findLastVisibleItemPosition()){ 
        linearLayoutManager.getChildAt(selectedPosition).setBackgroundResource(0); 
       } 
Các vấn đề liên quan