RecyclerView基础

来源:互联网 发布:手机轰炸软件免费版 编辑:程序博客网 时间:2024/06/06 01:18

单纯的笔记,需深入请研究其他大神的博客,谢谢!

效果:


1.引入 依赖:  compile 'com.android.support:recyclerview-v7:25.3.1'

2.activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.demo.demo10.MainActivity">    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="match_parent">    </android.support.v7.widget.RecyclerView></RelativeLayout>

3.每条item布局(item.xml):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="50dp">    <TextView        android:id="@+id/temp_item"        android:layout_width="match_parent"        android:layout_height="50dp"        android:gravity="center"        android:text="temp"/></LinearLayout>

4.基本分割线(DividerItemDecoration.java):

public class DividerItemDecoration extends RecyclerView.ItemDecoration {    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;    private Drawable mDivider;    private int mOrientation;    private static final int[] ATTRS = new int[]{            android.R.attr.listDivider    };    public DividerItemDecoration(Context context, int orientation) {        final TypedArray a = context.obtainStyledAttributes(ATTRS);        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) {        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);            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.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);        }    }}

5.MyAdapter.java:

class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {    private Context mContext;    private List<String> mDatas;    public MyAdapter(Context context) {        this.mContext = context;        mDatas = new ArrayList<>();        initData();    }    private void initData() {        for (int i = 'a'; i <= 'z'; i++) {            mDatas.add((char) i + "");        }    }    /**     * 点击和长按监听     */    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    private OnItemClickListener mOnItemClickListener;    public void setOnItemClickListener(OnItemClickListener listener) {        this.mOnItemClickListener = listener;    }    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item, parent, false));        return holder;    }    @Override    public void onBindViewHolder(final MyViewHolder holder, final int position) {        String str = mDatas.get(position);        holder.textView.setText(str);        //自定义点击事件和长按事件        if (mOnItemClickListener != null) {            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    int layoutPosition = holder.getLayoutPosition();//避免添加item时不刷新item索引                    mOnItemClickListener.onItemClick(holder.itemView, layoutPosition);                }            });            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    int layoutPosition = holder.getLayoutPosition();//避免添加item时不刷新item索引                    mOnItemClickListener.onItemLongClick(holder.itemView, layoutPosition);                    return true;                }            });        }    }    @Override    public int getItemCount() {        return mDatas.size();    }    class MyViewHolder extends RecyclerView.ViewHolder {        TextView textView;        public MyViewHolder(View itemView) {            super(itemView);            textView = (TextView) itemView.findViewById(R.id.temp_item);        }    }    /**     * 添加 item     */    public void addItem(int position) {        mDatas.add(position, "添加了数据");        notifyItemInserted(position);//切记不要写成notifyDataSetChanged()    }    /**     * 删除item     */    public void removeItem(int position) {        mDatas.remove(position);        Toast.makeText(mContext, "删除成功", Toast.LENGTH_SHORT).show();        notifyItemRemoved(position);//切记不要写成notifyDataSetChanged()    }}

6.MainActivity.java:

public class MainActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        adapter = new MyAdapter(this);        mRecyclerView.setAdapter(adapter);        mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置自动增删动画        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));        adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(MainActivity.this, "单击了第" + (position + 1) + "条item", Toast.LENGTH_SHORT).show();            }            @Override            public void onItemLongClick(View view, int position) {                adapter.removeItem(position);//长按删除            }        });    }}

项目中根据实际需求更改分割线和每个item样式.

原创粉丝点击