RecycleView显示不同类型的Item

之前也用过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是哪个的实例,取出数据,进行数据绑定

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值