RecyclerView(笔记)

来源:互联网 发布:windows安装器安装win7 编辑:程序博客网 时间:2024/06/05 05:58

写在前面

ListView早些时候还没用熟,后来就出了个RecyclerView,怀着好奇心和贪图所谓的“方便”,就对ListView嗤之以鼻,也不太知道它的使用方法了。现在也懒得回去重新看,就直接对RecyclerView下手了。


记录下自己对这个东西的一个入门学习。

首先如果是在AndroidStudio里的话,使用RecycleView直接Gradle即可。在eclipse里的话就需要多费些心思,要注意v7包与RecyclerView包的版本一致的问题。具体配置就不记录了。


从最基本用起:

public class MainActivity extends Activity {private RecyclerView rl_main;private MainViewAdapter mainViewAdapter;private List<User> dataList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rl_main = (RecyclerView) findViewById(R.id.rl_main);dataList = new ArrayList<>();for (int i = 0; i < 30; i++) {dataList.add(new User("name" + i + "  ", R.drawable.ic_launcher));}mainViewAdapter = new MainViewAdapter(this, dataList, R.layout.item);rl_main.setAdapter(mainViewAdapter);rl_main.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));}}


适配器和ViewHolder:

public class MainViewAdapter extends RecyclerView.Adapter<MyViewHolder> {private Context mContext;private List<User> mList;private int itemId;public MainViewAdapter(Context context, List<User> dataList, int itemId) {// TODO Auto-generated constructor stubmContext = context;mList = dataList;this.itemId = itemId;}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mList.size();}@Overridepublic void onBindViewHolder(MyViewHolder viewHolder, int position) {// TODO Auto-generated method stubviewHolder.tv_item.setText(mList.get(position).getName());viewHolder.iv_item.setBackgroundResource(mList.get(position).getImg());}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// TODO Auto-generated method stubView view = LayoutInflater.from(mContext).inflate(itemId, parent, false);MyViewHolder myViewHolder = new MyViewHolder(view);return myViewHolder;}}class MyViewHolder extends ViewHolder {TextView tv_item;ImageView iv_item;public MyViewHolder(View itemView) {super(itemView);// TODO Auto-generated constructor stubtv_item = (TextView) itemView.findViewById(R.id.tv_item);iv_item = (ImageView) itemView.findViewById(R.id.iv_item);}}


图:




A ViewHolder describes an item view and metadata about its place within the RecyclerView.
RecyclerView.Adapter implementations should subclass ViewHolder and add fields for caching potentially expensive findViewById(int) results.

大致说ViewHolder是用于描述我们的item布局和在里面的元数据,或者说就是对item里面的控件进行 findViewById(int) 的绑定。


在实现Adapter的时候,需要重写三个方法:

onCreateViewHolder(ViewGroup parent, int viewType)

getItemCount()

onBindViewHolder(MyViewHolder viewHolder, int position)



onCreateViewHolder(ViewGroup parent, int viewType) :

This method calls onCreateViewHolder(ViewGroup, int) to create a new RecyclerView.ViewHolder and initializes some private fields to be used by RecyclerView.

在这里创建我们的ViewHolder并初始化一些在RecyclerView里会被使用的私有的东西,像给ViewHolder指定item的布局,为每个item添加点击事件等。


getItemCount() :

Returns the total number of items in the data set hold by the adapter.

一般我们都是返回对象的size。


onBindViewHolder(MyViewHolder viewHolder, int position):

Called by RecyclerView to display the data at the specified position. This method should update the contents of the itemView to reflect the item at the given position.

在这里我们就要对item里的控件进行数据的设置显示了。


加些东西:

多Item布局:

实现让第一个item和最后一个item显示图片,其余的按照dataList的内容显示文字。

定义两个ViewHolder,并对其作出相关判断。

public class MultipleItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {// 用枚举类型来标记item的类型public enum HOLDER_TYPE {ITEM_IMAGE, ITEM_TEXT}private Context mContext;private List<String> mList;public MultipleItemAdapter(Context context, List<String> dataList) {mContext = context;mList = dataList;}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mList.size();}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {// TODO Auto-generated method stubif (holder instanceof TextViewHolder) {((TextViewHolder) holder).textview.setText(mList.get(position));}}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// TODO Auto-generated method stubView itemTextView = LayoutInflater.from(mContext).inflate(R.layout.item_text, parent, false);View itemImageView = LayoutInflater.from(mContext).inflate(R.layout.item_image, parent, false);if (viewType == HOLDER_TYPE.ITEM_TEXT.ordinal()) {TextViewHolder textViewHolder = new TextViewHolder(itemTextView);return textViewHolder;} else {ImageViewHolder imageViewHolder = new ImageViewHolder(itemImageView);return imageViewHolder;}}@Overridepublic int getItemViewType(int position) {// TODO Auto-generated method stubif (position != 0 && position != mList.size() - 1) {return HOLDER_TYPE.ITEM_TEXT.ordinal();} else {return HOLDER_TYPE.ITEM_IMAGE.ordinal();}}}class TextViewHolder extends RecyclerView.ViewHolder {TextView textview;public TextViewHolder(View itemView) {super(itemView);// TODO Auto-generated constructor stubtextview = (TextView) itemView.findViewById(R.id.tv_item);}}class ImageViewHolder extends RecyclerView.ViewHolder {ImageView imageView;public ImageViewHolder(View itemView) {super(itemView);// TODO Auto-generated constructor stubimageView = (ImageView) itemView.findViewById(R.id.iv_item);}}

这里主要多了getItemViewType(int position)这个方法。

Return the view type of the item at position for the purposes of view recycling.

根据位置来获取每个item的类型,这个类型也就是onCreateViewHolder(ViewGroup parent, int viewType) 里的viewType














参考与扩展:

RecyclerView使用详解(二)

RecyclerView.Adapter(需科学上网)



0 0
原创粉丝点击