2017-08-11 69 views
0

我想要删除一个项目,如果用户刷卡,并删除RecyclerView中的所有项目,如果用户单击deleteAll按钮,我尝试访问每个视图添加动画,但我不现在怎么样,我添加了动画创作,因为适配器给我的每一个观点持有人onBindViewHolder,这是我的适配器如何删除RecyclerView适配器中的所有项目与动画

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
Context context; 
List<String> stringList; 
public MyAdapter(Context context, List<String> stringList) { 
    this.context = context; 
    this.stringList = stringList; 
} 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context) 
      .inflate(R.layout.item,parent,false); 

    MyViewHolder viewHolder = new MyViewHolder(view); 
    return viewHolder; 
} 
@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); 
    holder.itemView.startAnimation(animation); 
    holder.bind(stringList.get(position)); 
} 


@Override 
public int getItemCount() { 
    return stringList.size(); 
} 



public void dismiss(int adapterPosition) { 
      stringList.remove(adapterPosition); 
      this.notifyItemRemoved(adapterPosition); 
    } 

public void removeItem(int position) { 
    this.stringList.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position, getItemCount() - position); 
} 




class MyViewHolder extends RecyclerView.ViewHolder 
     implements View.OnClickListener { 
    TextView textView; 
    String data; 
    public MyViewHolder(View itemView) { 
     super(itemView); 
     textView = itemView.findViewById(R.id.text); 
     itemView.setOnClickListener(this); 
    } 
    public void bind(String data) { 
     this.data = data; 
     textView.setText(data); 
    } 

    @Override 
    public void onClick(View view) { 
     stringList.remove(data); 
     notifyDataSetChanged(); 
    } 

}} 

我RecyclerView和适配器的主要活动,以及如何我处理全部删除,但问题是如何我可以添加动画

adapter = new MyAdapter(this,myList); 
    ItemTouchHelper.Callback callback = new SwipeHelper(adapter); 
    ItemTouchHelper helper = new ItemTouchHelper(callback); 
    recyclerView.setAdapter(adapter); 
    helper.attachToRecyclerView(recyclerView); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      for (int i = myList.size()-1 ; i >= 0 ; i--){ 
       adapter.removeItem(i); 
      } 
      //recyclerView.removeItemDecoration(); 
     } 
    }); 
+0

哪个动画你actaully怎么办?当你想用你的手机删除邮件时,它是否与gmail有什么相似的滑动动画? – berrytchaks

+0

是的,我想要当用户点击删除所有项目滑出回收站视图 – 3zcs

+0

在'RecyclerView'中做动画的正确方法是通过'ItemAnimator'。不要将动画放在适配器中,因为它不是适配器对动画布局更改的责任。请查看以下视频:[link](https://www.youtube.com/watch?v=imsr8NrIAMs&list=PLWz5rJ2EKKc_Tt7q77qwyKRgytF1RzRx8&index=6)。有关更多详细信息,请查看此存储库:[回购](https://github.com/vicky7230/Paprika) – Vicky

回答

0

您可以使用线程和延迟在每个循环中逐个删除/恢复项目。以下是我已经实现:

MainActivity.java

clearItemsView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final List<LineItem> lineItemsCopy = new ArrayList<>(lineItems); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        for (int i=0; i<lineItemsCopy.size(); i++) { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           salesOrderItemListAdapter.removeItem(0); 
          } 
         }); 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }).start(); 
      Snackbar snackbar = Snackbar.make(coordinatorLayout, getString(R.string.items_cleared_message), Snackbar.LENGTH_LONG) 
        .setAction(getString(R.string.label_undo), new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          new Thread(new Runnable() { 
           @Override 
           public void run() { 
            for (int i=0; i<lineItemsCopy.size(); i++) { 
             final int finalI = i; 
             runOnUiThread(new Runnable() { 
              @Override 
              public void run() { 
               salesOrderItemListAdapter.restoreItem(lineItemsCopy.get(finalI), 0); 
              } 
             }); 
             try { 
              Thread.sleep(500); 
             } catch (InterruptedException e) { 
              e.printStackTrace(); 
             } 
            } 
           } 
          }).start(); 
         } 
        }).setActionTextColor(Color.YELLOW); 
      snackbar.show(); 
     } 
    }); 

RecyclerViewAdapter.java

//Only remove & restore functions are shown  
    public void removeItem(int position) { 
     lineItems.remove(position); 
     notifyItemRemoved(position); 
    } 

    public void restoreItem(LineItem item, int position) { 
     lineItems.add(position, item); 
     notifyItemInserted(position); 
    } 
相关问题