RecyclerView 的使用

来源:互联网 发布:黑莓软件怎么删除 编辑:程序博客网 时间:2024/05/17 23:02

一直使用ListView,也没觉得有什么问题,可能还是自己太菜了。
官方突然出了个RecyclerView,据说是专门替代ListView的,也没觉得好用多少,还是因为自己太菜了。
不管怎么说,要紧跟时代的潮流,尽管不喜欢,也要去学习,说不定学着学着就爱上了呢~

废话不多说,坚持自己一贯的风格,尽量把代码写的最简单。一上效果图,二上代码,注释都在代码中。

美女效果图
效果图是个美女,莫怪,代码写着写着总会意淫一下,,,

一、引入相关包

compile 'com.android.support:design:23.3.0'

二、整体布局

这里布局就只有一个RecyclerView。

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/background">    <android.support.v7.widget.RecyclerView        android:id="@+id/recycler_view"        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>

三、item布局

这里也是只有一个TextView。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              xmlns:tools="http://schemas.android.com/tools"              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:layout_marginBottom="1dp"              android:background="#80000000"              android:orientation="vertical"              android:padding="10dp">    <TextView        android:id="@+id/tv_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textColor="#FFFFFF"        android:textSize="22sp"        tools:text="这是一个测试"/></LinearLayout>

四、封装Adapter-不用鸟它,直接使用就行

平时养成了坏习惯,看到不爽的东西,麻烦的东西,总是喜欢把它封装起来,为我所用,所以封装之后提供的接口也是按照我的习惯乱来的。
其中 DATA 为数据实体,比如:String、User什么的。
VH 为ViewHolder。
谷歌官方并没有给RecyclerView添加setOnItemClickListener接口,这个常用吧,但是没有,所以这里封装了一下。

package com.audienl.recyclerviewdemo.adapters;import android.content.Context;import android.support.annotation.LayoutRes;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;import java.util.List;/** * @author AudienL(591928179@qq.com) on 2016/4/22 */public abstract class SuperRVAdapter<DATA, VH extends RecyclerView.ViewHolder>        extends RecyclerView.Adapter<VH> {    protected Context context;    protected List<DATA> items = new ArrayList<>();    public SuperRVAdapter(Context context) {        this.context = context;    }    public SuperRVAdapter(Context context, List<DATA> items) {        this.context = context;        this.items = items;    }    /**     * 设置数据源     */    public void setItems(List<DATA> items) {        if (items != null) {            this.items = items;        }    }    /**     * 添加一个数据集     */    public void addItems(List<DATA> items) {        if (items != null) {            this.items.addAll(items);        }    }    /**     * 添加一条数据     */    public void addItem(DATA item) {        if (item != null) {            this.items.add(item);        }    }    /**     * 获取一条数据     */    public DATA getItem(int position) {        return items.get(position);    }    /**     * 清空数据     */    public void clear() {        items.clear();    }    @Override    public int getItemCount() {        return items.size();    }    @Override    public VH onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(context).inflate(getLayoutResId(), parent, false);        return onCreateViewHolder(view);    }    @Override    public void onBindViewHolder(final VH holder, final int position) {        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                onItemClick(v, holder.getAdapterPosition());                if (mOnItemClickListener != null) {                    mOnItemClickListener.onItemClick(v, holder.getAdapterPosition());                }            }        });        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                onItemLongClick(v, holder.getAdapterPosition());                if (mOnItemLongClickListener != null) {                    mOnItemLongClickListener.onItemLongClick(v, holder.getAdapterPosition());                }                return true;            }        });        onBindViewHolder(holder, items.get(position), position);    }    public abstract VH onCreateViewHolder(View view);    /**     * @param item 为当前 item 对应的数据     */    public abstract void onBindViewHolder(VH holder, DATA item, int position);    @LayoutRes    public abstract int getLayoutResId();    /**     * 会先调用此方法,再调用 OnItemClickListener 中的 onItemClick。     */    protected void onItemClick(View view, int position) {    }    /**     * 会先调用此方法,再调用 setOnItemLongClickListener 中的 onItemLongClick。     */    protected void onItemLongClick(View view, int position) {    }    // =========================================================    // Listeners    // =========================================================    protected OnItemClickListener mOnItemClickListener;    protected OnItemLongClickListener mOnItemLongClickListener;    public void setOnItemClickListener(OnItemClickListener listener) {        mOnItemClickListener = listener;    }    public void setOnItemLongClickListener(OnItemLongClickListener listener) {        mOnItemLongClickListener = listener;    }    public interface OnItemClickListener {        void onItemClick(View view, int position);    }    public interface OnItemLongClickListener {        void onItemLongClick(View view, int position);    }}

五、Adapter

这里直接继承上面封装好的Adapter就行。
onCreateViewHolder(View view)返回的是ViewHolder对象。ViewHolder类是必须有的,而且要继承RecyclerView.ViewHolder
onBindViewHolder(ViewHolder holder, String item, int position)就是把数据和view绑定起来,其中item就是item具体的数据了。
getLayoutResId()返回的就是这个item的布局了。

package com.audienl.recyclerviewdemo.adapters;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.TextView;import com.audienl.recyclerviewdemo.R;import butterknife.Bind;import butterknife.ButterKnife;/** * @author AudienL(591928179@qq.com) on 2016/4/22 */public class RVAdapter extends SuperRVAdapter<String, RVAdapter.ViewHolder> {    public RVAdapter(Context context) {        super(context);    }    @Override    public ViewHolder onCreateViewHolder(View view) {        return new ViewHolder(view);    }    @Override    public void onBindViewHolder(ViewHolder holder, String item, int position) {        holder.mTvText.setText(item);    }    @Override    public int getLayoutResId() {        return R.layout.item_recycler_view;    }    class ViewHolder extends RecyclerView.ViewHolder {        @Bind(R.id.tv_text)        TextView mTvText;        public ViewHolder(View itemView) {            super(itemView);            ButterKnife.bind(this, itemView);        }    }}

六、Activity

package com.audienl.recyclerviewdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;import com.audienl.recyclerviewdemo.adapters.RVAdapter;import com.audienl.recyclerviewdemo.adapters.SuperRVAdapter;import butterknife.Bind;import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Bind(R.id.recycler_view)    RecyclerView mRecyclerView;    private RVAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        // 数据源        mAdapter = new RVAdapter(this);        for (int i = 0; i < 20; i++) {            mAdapter.addItem("AudienL -> " + i);        }        // 设置布局        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        // 设置Adapter        mRecyclerView.setAdapter(mAdapter);        // 设置单击事件        mAdapter.setOnItemClickListener(new SuperRVAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Log.i(TAG, "onItemClick: position=" + position);            }        });        // 设置长按事件        mAdapter.setOnItemLongClickListener(new SuperRVAdapter.OnItemLongClickListener() {            @Override            public void onItemLongClick(View view, int position) {                Log.i(TAG, "onItemLongClick: position=" + position);            }        });    }}

整个使用DEMO大概就是酱紫。哪里写错了留个言我改下。

源代码: https://github.com/AudienL/RecyclerViewDemo (源代码会不断更新,可能和博客的代码不同步)

1 0
原创粉丝点击