你的位置:首页 > 操作系统

[操作系统]RecyclerView 的使用



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

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

 

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

一、引入相关包

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

二、整体布局

这里布局就只有一个RecyclerView。

<??><RelativeLayout  ="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。

<??><LinearLayout ="http://schemas.android.com/apk/res/android"       ="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 (源代码会不断更新,可能和博客的代码不同步)