RecyclerView 的一些基本知识点,可以去官网上查看到。现在这些只是个人的一些笔记而已。
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
public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> mStringList; private MyRecyclerViewAdapter mRecyclerViewAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); initDates(); initView(); mRecyclerViewAdapter = new MyRecyclerViewAdapter(this, mStringList); mRecyclerView.setAdapter(mRecyclerViewAdapter); // 设置RecyclerView的方向 LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayout.VERTICAL, false); mRecyclerView.setLayoutManager(manager); // 设置RecyclerView的分割线 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, LinearLayout.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration); // 设置RecyclerView添加或删除的动画 ScaleInAnimator animator = new ScaleInAnimator(); mRecyclerView.setItemAnimator(animator); // 设置RecyclerView 的点击事件 mRecyclerView.addOnItemTouchListener( new RecyclerItemClickListener(RecyclerViewActivity.this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(RecyclerViewActivity.this, "item click position: " + position , Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { Toast.makeText(RecyclerViewActivity.this, "item long click position: " + position , Toast.LENGTH_SHORT).show(); } }) ); } // 初始化数据 private void initDates(){ mStringList = new ArrayList<>(); for (int i = 'A'; i <= 'z'; i ++){ mStringList.add("" + (char)i); } } // 初始化视图 private void initView(){ mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_recycler_view, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.action_add: mRecyclerViewAdapter.add(4); return true; case R.id.action_deleted: mRecyclerViewAdapter.deleted(1); return true; } return super.onOptionsItemSelected(item); } }
2.MyRecyclerViewAdapter.java
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyViewHolder> { private Context mContext; private List<String> mStringList; private LayoutInflater mLayoutInflater; public MyRecyclerViewAdapter(Context context, List<String> list) { mContext = context; mStringList = list; mLayoutInflater = LayoutInflater.from(context); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.i("yxh", "onCreateViewHolder: "); View view = mLayoutInflater.inflate(R.layout.item_recycler_view, parent, false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv_recycler_view.setText(mStringList.get(position)); } @Override public int getItemCount() { Log.i("yxh", "getItemCount: " + mStringList.size()); return mStringList.size(); } public void add(int position){ mStringList.add(position, "Add One"); notifyItemInserted(position); // notifyDateChanged() } public void deleted(int position){ mStringList.remove(position); notifyItemRemoved(position); } } class MyViewHolder extends RecyclerView.ViewHolder { TextView tv_recycler_view; public MyViewHolder(View itemView) { super(itemView); tv_recycler_view = (TextView) itemView.findViewById(R.id.tv_item_recycler_view); } }
DividerItemDecoration.java
public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; // 通过获取theme,而获取lineDivider public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); // 通过获取theme,而获取lineDivider mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) { // Log.v("recyclerview - itemdecoration", "onDraw()"); if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); RecyclerView v = new RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } }
然后在RecyclerViewActivity中使用
// 设置RecyclerView的分割线 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, LinearLayout.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration);
4、Item的增加与删除的东西效果可以使用默认的,也可以使用自定义,github上就用已经有开源的可用https://github.com/wasabeef/recyclerview-animators
所以,我们就直接拿来用就好了
// 设置RecyclerView添加或删除的动画 ScaleInAnimator animator = new ScaleInAnimator(); mRecyclerView.setItemAnimator(animator);
5、RecyclerView没有提供Item的方法,所以,需要我们自己去实现。 不过,也可以在网上找例子,我自己整理了一下。
通过继承RecyclerView.onItemTouchListener 我们可以自定义item的点击以及长按效果
RecyclerItemClickListener.java
** * Created by Administrator on 2015/9/17. * 创建RecyclerView的Item点击类 * 网址:http://sapandiwakar.in/recycler-view-item-click-handler/ * http://stackoverflow.com/questions/24471109/recyclerview-onclick/26826692#26826692 * http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/ */ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { public interface OnItemClickListener{ void onItemClick(View view, int position); void onItemLongClick(View view, int position); } GestureDetector mGestureDetector; private OnItemClickListener mItemClickListener; public RecyclerItemClickListener(Context context, final RecyclerView view, OnItemClickListener listener){ mItemClickListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mItemClickListener != null){ mItemClickListener.onItemLongClick(view, view.getChildAdapterPosition(childView)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mItemClickListener != null && mGestureDetector.onTouchEvent(e)) { mItemClickListener.onItemClick(view, view.getChildAdapterPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } }
// 设置RecyclerView 的点击事件 mRecyclerView.addOnItemTouchListener( new RecyclerItemClickListener(RecyclerViewActivity.this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(RecyclerViewActivity.this, "item click position: " + position , Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { Toast.makeText(RecyclerViewActivity.this, "item long click position: " + position , Toast.LENGTH_SHORT).show(); } }) );