RecyclerView 以及 ItemClickListener的实现

  RecyclerView 的一些基本知识点,可以去官网上查看到。现在这些只是个人的一些笔记而已。

        

    1.Item 位置   ----------  LayoutManager
       Item 分割线 --------- ItemDecoration
       Item 动画效果 ------- ItemAnimator

      2、自定义分割线
          1)、在drawable 中定义已shape为root 的xml文件
          2)、在style中引用
      
      3、Item增加、删除调用的方法
            notifyItemInserted() notifyItemRemove()

      4、Item 的点击事件需要自己定义实现


      具体的实现:
    1、在build.gradle 中增加
       
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.android.support:recyclerview-v7:22.1.1'
}


    2、RecyclerViewActivity

[java]  view plain  copy
  1. public class RecyclerViewActivity extends AppCompatActivity {  
  2.     private RecyclerView mRecyclerView;  
  3.     private List<String> mStringList;  
  4.     private MyRecyclerViewAdapter mRecyclerViewAdapter;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_recycler_view);  
  9.   
  10.         initDates();  
  11.   
  12.         initView();  
  13.   
  14.         mRecyclerViewAdapter = new MyRecyclerViewAdapter(this, mStringList);  
  15.         mRecyclerView.setAdapter(mRecyclerViewAdapter);  
  16.   
  17.         // 设置RecyclerView的方向  
  18.         LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayout.VERTICAL, false);  
  19.         mRecyclerView.setLayoutManager(manager);  
  20.   
  21.         // 设置RecyclerView的分割线  
  22.         DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, LinearLayout.VERTICAL);  
  23.         mRecyclerView.addItemDecoration(dividerItemDecoration);  
  24.   
  25.         // 设置RecyclerView添加或删除的动画  
  26.         ScaleInAnimator animator = new ScaleInAnimator();  
  27.         mRecyclerView.setItemAnimator(animator);  
  28.   
  29.         // 设置RecyclerView 的点击事件  
  30.         mRecyclerView.addOnItemTouchListener(  
  31.                 new RecyclerItemClickListener(RecyclerViewActivity.this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {  
  32.                     @Override  
  33.                     public void onItemClick(View view, int position) {  
  34.                         Toast.makeText(RecyclerViewActivity.this"item click position: " + position , Toast.LENGTH_SHORT).show();  
  35.                     }  
  36.   
  37.                     @Override  
  38.                     public void onItemLongClick(View view, int position) {  
  39.                         Toast.makeText(RecyclerViewActivity.this"item long click position: " + position , Toast.LENGTH_SHORT).show();  
  40.                     }  
  41.                 })  
  42.         );  
  43.   
  44.     }  
  45.   
  46.     // 初始化数据  
  47.     private void initDates(){  
  48.         mStringList = new ArrayList<>();  
  49.         for (int i = 'A'; i  <= 'z'; i ++){  
  50.             mStringList.add("" + (char)i);  
  51.         }  
  52.     }  
  53.   
  54.     // 初始化视图  
  55.     private void initView(){  
  56.         mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
  57.   
  58.     }  
  59.   
  60.     @Override  
  61.     public boolean onCreateOptionsMenu(Menu menu) {  
  62.         MenuInflater  inflater = getMenuInflater();  
  63.         inflater.inflate(R.menu.menu_recycler_view, menu);  
  64.         return true;  
  65.     }  
  66.   
  67.     @Override  
  68.     public boolean onOptionsItemSelected(MenuItem item) {  
  69.         switch (item.getItemId()){  
  70.             case R.id.action_add:  
  71.                 mRecyclerViewAdapter.add(4);  
  72.                 return true;  
  73.   
  74.             case R.id.action_deleted:  
  75.                 mRecyclerViewAdapter.deleted(1);  
  76.                 return  true;  
  77.         }  
  78.         return super.onOptionsItemSelected(item);  
  79.     }  
  80. }  

    其中我们的Adapter需要继承RecyclerView的Adapter

2.MyRecyclerViewAdapter.Java

[java]  view plain  copy
  1. public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyViewHolder> {  
  2.   
  3.     private Context mContext;  
  4.     private List<String> mStringList;  
  5.     private LayoutInflater mLayoutInflater;  
  6.   
  7.     public MyRecyclerViewAdapter(Context context, List<String> list) {  
  8.         mContext = context;  
  9.         mStringList = list;  
  10.         mLayoutInflater = LayoutInflater.from(context);  
  11.     }  
  12.   
  13.     @Override  
  14.     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  15.         Log.i("yxh""onCreateViewHolder: ");  
  16.         View view = mLayoutInflater.inflate(R.layout.item_recycler_view, parent, false);  
  17.         MyViewHolder viewHolder = new MyViewHolder(view);  
  18.         return viewHolder;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onBindViewHolder(MyViewHolder holder, int position) {  
  23.         holder.tv_recycler_view.setText(mStringList.get(position));  
  24.     }  
  25.   
  26.   
  27.     @Override  
  28.     public int getItemCount() {  
  29.         Log.i("yxh""getItemCount: " + mStringList.size());  
  30.         return mStringList.size();  
  31.     }  
  32.   
  33.     public  void add(int position){  
  34.         mStringList.add(position, "Add One");  
  35.         notifyItemInserted(position);           // notifyDateChanged()  
  36.     }  
  37.   
  38.     public  void deleted(int position){  
  39.         mStringList.remove(position);  
  40.         notifyItemRemoved(position);  
  41.     }  
  42. }  
  43.   
  44.   
  45. class  MyViewHolder extends RecyclerView.ViewHolder {  
  46.     TextView tv_recycler_view;  
  47.   
  48.     public MyViewHolder(View itemView) {  
  49.         super(itemView);  
  50.         tv_recycler_view = (TextView) itemView.findViewById(R.id.tv_item_recycler_view);  
  51.     }  
  52. }  

  3、Item的分割线需要自定义,所以,这是在网上找到的。

DividerItemDecoration.java

     

[java]  view plain  copy
  1. public class DividerItemDecoration extends RecyclerView.ItemDecoration {  
  2.   
  3.     private static final int[] ATTRS = new int[]{android.R.attr.listDivider};             // 通过获取theme,而获取lineDivider  
  4.   
  5.     public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;  
  6.   
  7.     public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;  
  8.   
  9.   
  10.     private Drawable mDivider;  
  11.   
  12.     private int mOrientation;  
  13.   
  14.     public DividerItemDecoration(Context context, int orientation) {  
  15.         final TypedArray a = context.obtainStyledAttributes(ATTRS);          // 通过获取theme,而获取lineDivider  
  16.         mDivider = a.getDrawable(0);  
  17.         a.recycle();  
  18.         setOrientation(orientation);  
  19.     }  
  20.   
  21.     public void setOrientation(int orientation) {  
  22.         if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {  
  23.             throw new IllegalArgumentException("invalid orientation");  
  24.         }  
  25.         mOrientation = orientation;  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onDraw(Canvas c, RecyclerView parent) {  
  30. //      Log.v("recyclerview - itemdecoration", "onDraw()");  
  31.         if (mOrientation == VERTICAL_LIST) {  
  32.             drawVertical(c, parent);  
  33.         } else {  
  34.             drawHorizontal(c, parent);  
  35.         }  
  36.     }  
  37.   
  38.     public void drawVertical(Canvas c, RecyclerView parent) {  
  39.         final int left = parent.getPaddingLeft();  
  40.         final int right = parent.getWidth() - parent.getPaddingRight();  
  41.   
  42.         final int childCount = parent.getChildCount();  
  43.   
  44.         for (int i = 0; i < childCount; i++) {  
  45.             final View child = parent.getChildAt(i);  
  46.             RecyclerView v = new RecyclerView(parent.getContext());  
  47.             final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();  
  48.             final int top = child.getBottom() + params.bottomMargin;  
  49.             final int bottom = top + mDivider.getIntrinsicHeight();  
  50.             mDivider.setBounds(left, top, right, bottom);  
  51.             mDivider.draw(c);  
  52.         }  
  53.     }  
  54.   
  55.     public void drawHorizontal(Canvas c, RecyclerView parent) {  
  56.         final int top = parent.getPaddingTop();  
  57.         final int bottom = parent.getHeight() - parent.getPaddingBottom();  
  58.   
  59.         final int childCount = parent.getChildCount();  
  60.         for (int i = 0; i < childCount; i++) {  
  61.             final View child = parent.getChildAt(i);  
  62.             final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();  
  63.             final int left = child.getRight() + params.rightMargin;  
  64.             final int right = left + mDivider.getIntrinsicHeight();  
  65.             mDivider.setBounds(left, top, right, bottom);  
  66.             mDivider.draw(c);  
  67.         }  
  68.     }  
  69.   
  70.     @Override  
  71.     public void getItemOffsets(Rect outRect, int itemPosition,  
  72.                                RecyclerView parent) {  
  73.         if (mOrientation == VERTICAL_LIST) {  
  74.             outRect.set(000, mDivider.getIntrinsicHeight());  
  75.         } else {  
  76.             outRect.set(00, mDivider.getIntrinsicWidth(), 0);  
  77.         }  
  78.     }  
  79. }  
     

     然后在RecyclerViewActivity中使用

[java]  view plain  copy
  1. // 设置RecyclerView的分割线  
  2.      DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, LinearLayout.VERTICAL);  
  3.      mRecyclerView.addItemDecoration(dividerItemDecoration);  
      

     4、Item的增加与删除的东西效果可以使用默认的,也可以使用自定义,github上就用已经有开源的可用https://github.com/wasabeef/recyclerview-animators

      所以,我们就直接拿来用就好了

[java]  view plain  copy
  1. // 设置RecyclerView添加或删除的动画  
  2.       ScaleInAnimator animator = new ScaleInAnimator();  
  3.       mRecyclerView.setItemAnimator(animator);  
    

     5、RecyclerView没有提供Item的方法,所以,需要我们自己去实现。 不过,也可以在网上找例子,我自己整理了一下。

       通过继承RecyclerView.onItemTouchListener 我们可以自定义item的点击以及长按效果

      RecyclerItemClickListener.java

[java]  view plain  copy
  1. **  
  2.  * Created by Administrator on 2015/9/17.  
  3.  *  创建RecyclerView的Item点击类  
  4.  *  网址:http://sapandiwakar.in/recycler-view-item-click-handler/  
  5.  *             http://stackoverflow.com/questions/24471109/recyclerview-onclick/26826692#26826692  
  6.  *             http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/  
  7.  */  
  8. public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {  
  9.   
  10.     public interface  OnItemClickListener{  
  11.          void onItemClick(View view, int position);  
  12.          void onItemLongClick(View view, int position);  
  13.     }  
  14.   
  15.     GestureDetector mGestureDetector;  
  16.     private OnItemClickListener mItemClickListener;  
  17.   
  18.     public RecyclerItemClickListener(Context context, final RecyclerView view, OnItemClickListener listener){  
  19.         mItemClickListener = listener;  
  20.         mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){  
  21.             @Override  
  22.             public boolean onSingleTapUp(MotionEvent e) {  
  23.                 return true;  
  24.             }  
  25.   
  26.             @Override  
  27.             public void onLongPress(MotionEvent e) {  
  28.                 View childView = view.findChildViewUnder(e.getX(), e.getY());  
  29.                 if (childView != null && mItemClickListener != null){  
  30.                     mItemClickListener.onItemLongClick(view, view.getChildAdapterPosition(childView));  
  31.                 }  
  32.             }  
  33.         });  
  34.   
  35.     }  
  36.     @Override  
  37.     public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {  
  38.         View childView = view.findChildViewUnder(e.getX(), e.getY());  
  39.         if (childView != null && mItemClickListener != null && mGestureDetector.onTouchEvent(e)) {  
  40.             mItemClickListener.onItemClick(view, view.getChildAdapterPosition(childView));  
  41.         }  
  42.         return false;  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onTouchEvent(RecyclerView rv, MotionEvent e) {  
  47.   
  48.     }  
  49. }  

   在RecyclerViewActivity中使用

    

[java]  view plain  copy
  1. // 设置RecyclerView 的点击事件  
  2.        mRecyclerView.addOnItemTouchListener(  
  3.                new RecyclerItemClickListener(RecyclerViewActivity.this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {  
  4.                    @Override  
  5.                    public void onItemClick(View view, int position) {  
  6.                        Toast.makeText(RecyclerViewActivity.this"item click position: " + position , Toast.LENGTH_SHORT).show();  
  7.                    }  
  8.   
  9.                    @Override  
  10.                    public void onItemLongClick(View view, int position) {  
  11.                        Toast.makeText(RecyclerViewActivity.this"item long click position: " + position , Toast.LENGTH_SHORT).show();  
  12.                    }  
  13.                })  
  14.        );  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值