之前也用过listview来显示不同的item,不过现在recycleview出来那么久了,也越来越多人用了,现在我也觉得recycleview比listview好用了.所以就有了这篇文章,作者才疏学浅,如果有什么错的地方欢迎指正.如果你不熟悉recycleview,建议先熟悉它的用法
下面demo仿造zaker的设置界面
步骤
1. 创建不同类型的item对应的布局文件
2. 为每个类型的item创建数据bean类
3. 为每个类型的item创建viewholder
4. 创建通用的item数据bean类,这个类有两个属性:(1)泛型T用来装载每个类型的item的数据bean,(2).dataType用来标识数据Bean的类型
5. 创建Adapter类
6. 在Activity使用recycleview
先上效果图把
点击下载demo
布局文件
布局文件就不上了,demo中属于item项的布局文件有三个:
1.recycleview_head.xml是recycleview第一项布局文件,
2.item_text.xml是常规的的item布局文件,
3.item_dividing.xml是分隔条的布局文件
viewholder
1.HeadViewHolder
public class HeadViewHolder extends RecyclerView.ViewHolder{
public CircleImageView circleImageView;
public TextView textView;
public HeadViewHolder (View itemView) {
super(itemView);
circleImageView= (CircleImageView) itemView.findViewById(R.id.touxiang_image);
textView= (TextView) itemView.findViewById(R.id.tv_name);
}
}
2.ItemTextAndImageHolder
public class ItemTextAndImageHolder extends RecyclerView.ViewHolder{
public TextView tv_text;
public ImageView iv_next;
public ItemTextAndImageHolder (View itemView) {
super(itemView);
tv_text= (TextView) itemView.findViewById(R.id.tv_text);
iv_next= (ImageView) itemView.findViewById(R.id.iv_next);
}
}
3.ItemDavidingViewHolder
public class ItemDavidingViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public ItemDavidingViewHolder (View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_more);
}
}
三个不同类型item项的数据bean
1.HeadItem
package com.example.konglinghuashi.zakersetting.beans;
/**
* Created by KongLingHuaShi on 2015/10/24.
*/
public class HeadItem {
int image;
String name;
public HeadItem () {
}
public HeadItem (int image, String name) {
this.image = image;
this.name = name;
}
public int getImage () {
return image;
}
public void setImage (int image) {
this.image = image;
}
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
}
2.NormalItem
package com.example.konglinghuashi.zakersetting.beans;
/**
* Created by KongLingHuaShi on 2015/10/24.
*/
public class NormalItem {
String text;
int image;
public NormalItem (String text, int image) {
this.text = text;
this.image = image;
}
public NormalItem () {
}
public String getText () {
return text;
}
public void setText (String text) {
this.text = text;
}
public int getImage () {
return image;
}
public void setImage (int image) {
this.image = image;
}
}
3.DavidingItem
package com.example.konglinghuashi.zakersetting.beans;
/**
* Created by KongLingHuaShi on 2015/10/24.
*/
public class DavidingItem {
String text;
public DavidingItem () {
}
public DavidingItem (String text) {
this.text = text;
}
public String getText () {
return text;
}
public void setText (String text) {
this.text = text;
}
}
通用的item数据bean类
RecycleViewItemData
package com.example.konglinghuashi.zakersetting.beans;
/**
* Created by KongLingHuaShi on 2015/10/24.
*/
public class RecycleViewItemData<T> {
//用来装载不同类型的item数据bean
T t;
//item数据bean的类型
int dataType;
public RecycleViewItemData () {
}
public RecycleViewItemData (T t, int dataType) {
this.t = t;
this.dataType = dataType;
}
public T getT () {
return t;
}
public void setT (T t) {
this.t = t;
}
public int getDataType () {
return dataType;
}
public void setDataType (int dataType) {
this.dataType = dataType;
}
}
RecycleViewAdapter,这个是重点
package com.example.konglinghuashi.zakersetting.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.konglinghuashi.zakersetting.R;
import com.example.konglinghuashi.zakersetting.beans.DavidingItem;
import com.example.konglinghuashi.zakersetting.beans.HeadItem;
import com.example.konglinghuashi.zakersetting.beans.NormalItem;
import com.example.konglinghuashi.zakersetting.beans.RecycleViewItemData;
import com.example.konglinghuashi.zakersetting.viewholder.HeadViewHolder;
import com.example.konglinghuashi.zakersetting.viewholder.ItemDavidingViewHolder;
import com.example.konglinghuashi.zakersetting.viewholder.ItemTextAndImageHolder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by KongLingHuaShi on 2015/10/24.
*/
public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//recycleview的数据集合
List<RecycleViewItemData> mData;
//开放数据接口,让使用到adapter的地方可以操作mData
public List<RecycleViewItemData> getData () {
return mData;
}
public RecycleViewAdapter () {
mData = new ArrayList<>();
}
//创建ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
//如果viewType是ITEM_TYPE.ITEM_TYPE_HEAD类型,则创建HeadViewHolder型viewholder
if (viewType == ITEM_TYPE.ITEM_TYPE_HEAD.ordinal()) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_head, parent, false);
HeadViewHolder viewHolder = new HeadViewHolder(view);
return viewHolder;
}
//如果viewType是ITEM_TYPE.ITEM_TYPE_TEXT类型,则创建ItemTextViewHolder型viewholder
if (viewType == ITEM_TYPE.ITEM_TYPE_TEXT.ordinal()) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text, parent, false);
ItemTextAndImageHolder viewHolder = new ItemTextAndImageHolder(view);
return viewHolder;
}
//如果viewType是ITEM_TYPE_DAVIDING,则创建ItemDavidingViewHolder型viewholder
if (viewType == ITEM_TYPE.ITEM_TYPE_DAVIDING.ordinal()) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dividing, parent, false);
ItemDavidingViewHolder viewHolder = new ItemDavidingViewHolder(view);
return viewHolder;
}
return null;
}
//绑定数据
@Override
public void onBindViewHolder (RecyclerView.ViewHolder holder, int position) {
if (holder instanceof HeadViewHolder) {
HeadItem headItem = (HeadItem) mData.get(position).getT();
((HeadViewHolder) holder).circleImageView.setImageResource(headItem.getImage());
((HeadViewHolder) holder).textView.setText(headItem.getName());
}
//如果holder是ItemTextAndImageHolder的实例
if (holder instanceof ItemTextAndImageHolder) {
//从数据集合中取出该项
NormalItem normalItem = (NormalItem) mData.get(position).getT();
//设置文本和图片
((ItemTextAndImageHolder) holder).tv_text.setText(normalItem.getText());
((ItemTextAndImageHolder) holder).iv_next.setImageResource(normalItem.getImage());
}
//如果holder是ItemDavidingViewHolder的实例
if (holder instanceof ItemDavidingViewHolder) {
DavidingItem davidingItem = (DavidingItem) mData.get(position).getT();
((ItemDavidingViewHolder) holder).textView.setText(davidingItem.getText());
}
}
//返回当前位置的数据是哪种数据类型(头部,普通数据,还是分割条)
@Override
public int getItemViewType (int position) {
return mData.get(position).getDataType();
}
//返回数据集合的大小
@Override
public int getItemCount () {
return mData.size();
}
/**
* 枚举类型,用来标识是哪一种类型的数据bean
*/
public enum ITEM_TYPE {
ITEM_TYPE_HEAD,
ITEM_TYPE_TEXT,
ITEM_TYPE_DAVIDING,
}
}
MainActivity
package com.example.konglinghuashi.zakersetting.activity;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.example.konglinghuashi.zakersetting.R;
import com.example.konglinghuashi.zakersetting.beans.DavidingItem;
import com.example.konglinghuashi.zakersetting.beans.HeadItem;
import com.example.konglinghuashi.zakersetting.beans.NormalItem;
import com.example.konglinghuashi.zakersetting.adapter.RecycleViewAdapter;
import com.example.konglinghuashi.zakersetting.beans.RecycleViewItemData;
import com.example.konglinghuashi.zakersetting.tools.RecycleviewDaviding;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Toolbar toolbar;
RecycleViewAdapter adapter;
RecyclerView recyclerView;
LinearLayoutManager linearLayoutManager;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
recyclerView = (RecyclerView) findViewById(R.id.recycleview);
linearLayoutManager = new LinearLayoutManager(this);
adapter = new RecycleViewAdapter();
toolbar.setTitle("返回");
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.mipmap.iconfont_fanhui);
initData();
recyclerView.addItemDecoration(new RecycleviewDaviding(this, R.drawable.daviding));
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
int id = item.getItemId();
return super.onOptionsItemSelected(item);
}
void initData () {
//把头部添加进来
RecycleViewItemData<HeadItem> itemData0=new RecycleViewItemData<>();
itemData0.setT(new HeadItem(R.mipmap.touxiang,"空灵画师"));
itemData0.setDataType(RecycleViewAdapter.ITEM_TYPE.ITEM_TYPE_HEAD.ordinal());
adapter.getData().add(itemData0);
//常规项的数据
List<String> text = new ArrayList<>();
text.add(getString(R.string.fenxiang));
text.add(getString(R.string.xiaoxi));
text.add(getString(R.string.wanle));
text.add(getString(R.string.zixun));
text.add(getString(R.string.jifen));
text.add(getString(R.string.shoucang));
//把前面6项添加
for (int i = 0; i <text.size(); ++i) {
RecycleViewItemData<NormalItem> itemData = new RecycleViewItemData<>();
itemData.setT(new NormalItem(text.get(i), R.mipmap.iconfont_xiayiye));
itemData.setDataType(RecycleViewAdapter.ITEM_TYPE.ITEM_TYPE_TEXT.ordinal());
adapter.getData().add(itemData);
}
//把分隔条添加
RecycleViewItemData<DavidingItem> itemData1 = new RecycleViewItemData<>();
itemData1.setT(new DavidingItem());
itemData1.setDataType(RecycleViewAdapter.ITEM_TYPE.ITEM_TYPE_DAVIDING.ordinal());
adapter.getData().add(itemData1);
//添加最后两项
text.add(getString(R.string.lixian));
text.add(getString(R.string.gengduo));
RecycleViewItemData<NormalItem> itemData2 = new RecycleViewItemData<>();
itemData2.setT(new NormalItem(text.get(6), R.mipmap.iconfont_xiayiye));
itemData2.setDataType(RecycleViewAdapter.ITEM_TYPE.ITEM_TYPE_TEXT.ordinal());
adapter.getData().add(itemData2);
RecycleViewItemData<NormalItem> itemData3 = new RecycleViewItemData<>();
itemData3.setT(new NormalItem(text.get(7), R.mipmap.iconfont_xiayiye));
itemData3.setDataType(RecycleViewAdapter.ITEM_TYPE.ITEM_TYPE_TEXT.ordinal());
adapter.getData().add(itemData3);
}
}
总结:看似有很多的类要写,其实按照步骤一步一步做,明白思路,就很好理解了.这里面用到了圆形ImageView的第三方组件circleiamgeview,还有每个item之间细细的分割线都没有贴出代码,不在本文的讨论范围了,使用起来也很简单.recycleview有不同的数据项,所以我们需要一个通用的数据项RecycleViewItemData来填充,RecycleViewItemData里面的泛型属性T可以填充三个真正的数据类型,HeadItem,NormalItem还有DavidingItem.然后adapter里面onCreateViewHolder方法里面根据viewType创建不同的viewholder并返回.最后在onBindViewHolder里判断viewholder是哪个的实例,取出数据,进行数据绑定