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
- 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);
- }
- }
其中我们的Adapter需要继承RecyclerView的Adapter
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);
- }
- }
3、Item的分割线需要自定义,所以,这是在网上找到的。
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) {
- }
- }
在RecyclerViewActivity中使用
- // 设置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();
- }
- })
- );