RecyclerView的优雅写法

1.Viewholder类

package com.example.yourdream.recyclerviewdemo;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * RecyclerView视图控制器
 *
 * Created by yourdream on 2016/11/17.
 */
public abstract class ViewHolder<T> extends RecyclerView.ViewHolder
{
    protected Context mContext;

    public ViewHolder(Context context, ViewGroup parent, int layoutId)
    {
        super(LayoutInflater.from(context).inflate(layoutId, parent, false));
        mContext = context;
        findView(itemView);
    }

    public ViewHolder(View itemView)
    {
        super(itemView);
    }

    /**
     * 设置数据的接口,即将数据与View联系起来
     *
     * @param data
     */
    public abstract void setData(T data);

    /**
     * 与适配器对应的控件初始化操作,需要子类扩展
     * @param itemView
     */
    public abstract void findView(View itemView);



}


2.基类适配器

package com.example.yourdream.recyclerviewdemo;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/**
 * RecyclerView适配器基类
 *
 * Created by yourdream on 2016/11/17.
 */
public class RecyclerViewBaseAdapter extends RecyclerView.Adapter<ViewHolder> {



    protected Context context;
    private List<ViewDataType> dataList;
    private ViewDataType loadMoreVHModel;
    private boolean showLoadMore;

    public RecyclerViewBaseAdapter(Context context) {
        this.context = context;
    }

    public void addData(List<? extends ViewDataType> append) {
        getDataList().addAll(append);
    }

    public void addData(ViewDataType vhModel) {
        List<ViewDataType> list = new ArrayList<>();
        list.add(vhModel);
        addData(list);
    }

    public void clean() {
        getDataList().clear();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        return null;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setData(getDataList().get(position));
    }

    @Override
    public int getItemCount() {
        return getDataList().size();
    }

    /**
     * 获取视图类型,从数据中获取
     * 即从数据中设定一个类型用来区分不同的视图
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position)
    {
        return getDataList().get(position).getItemType();
    }

    public List<ViewDataType> getDataList() {
        if (dataList == null) {
            dataList = new ArrayList<>();
        }
        return dataList;
    }



}


3.测试适配器

package com.example.yourdream.recyclerviewdemo;

import android.content.Context;
import android.view.ViewGroup;

import view.SigleTextView;
import view.TwoTextView;

/**
 * 测试适配器1,用来实现一个listView其中每行一个文本
 * 数据中的类型如果为1则创建一个文本,
 * 如果为2创建一个包含2个文本
 * Created by yourdream on 2016/11/17.
 */
public class Adapter1 extends RecyclerViewBaseAdapter
{

    public Adapter1(Context context)
    {
        super(context);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (viewType == 1) {
            SigleTextView sigleTextView = new SigleTextView(context, parent);
            return sigleTextView;
        }
        if(viewType == 2)
        {
            return new TwoTextView(context, parent);
        }

        return super.onCreateViewHolder(parent,viewType);

    }
}


4.数据类型区分接口

package com.example.yourdream.recyclerviewdemo;

/**
 * 视图数据类型,用来 区分不同的视图
 *
 * Created by yourdream on 2016/11/17.
 */
public interface ViewDataType {
    int getItemType();
}

5.两种测试用的数据类型

package data;

import com.example.yourdream.recyclerviewdemo.ViewDataType;

/**
 * Created by yourdream on 2016/11/17.
 */
public class SigleData implements ViewDataType{

    private String name;


    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }


    @Override
    public int getItemType()
    {
        return 1;
    }
}


测试数据模型2:

package data;

import com.example.yourdream.recyclerviewdemo.ViewDataType;

/**
 * Created by yourdream on 2016/11/17.
 */

public class TwoData implements ViewDataType{

    private String name;
    private String sex;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public int getItemType() {
        return 2;
    }
}



6.与数据对应的视图:

package view;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.yourdream.recyclerviewdemo.R;
import com.example.yourdream.recyclerviewdemo.ViewHolder;

import data.SigleData;

/**
 * Created by yourdream on 2016/11/17.
 */

public class SigleTextView extends ViewHolder<SigleData>
{
    private TextView name;


    /**
     * 重写基类方法,创建属于自己的视图
     *
     * @param context
     * @param parent
     */
    public SigleTextView(Context context, ViewGroup parent) {
        super(context, parent, R.layout.view_sigle);
    }

    @Override
    public void setData(SigleData data) {
        name.setText(data.getName());
    }

    @Override
    public void findView(View itemView) {
        name = (TextView)itemView.findViewById(R.id.sigle);
    }
}


视图二:

package view;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.yourdream.recyclerviewdemo.R;
import com.example.yourdream.recyclerviewdemo.ViewHolder;

import data.TwoData;

/**
 * Created by yourdream on 2016/11/17.
 */

public class TwoTextView extends ViewHolder<TwoData>{

    private TextView name;
    private TextView sex;

    public TwoTextView(Context context, ViewGroup parent) {
        super(context, parent, R.layout.view_two);
    }

    @Override
    public void setData(TwoData data) {

        name.setText(data.getName());
        sex.setText(data.getSex());
    }

    @Override
    public void findView(View itemView) {
        name = (TextView)itemView.findViewById(R.id.two_name);
        sex = (TextView)itemView.findViewById(R.id.two_sex);
    }
}



mainactivity

package com.example.yourdream.recyclerviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import data.SigleData;
import data.TwoData;

public class MainActivity extends Activity {

    private RecyclerView recyclerView;
    private Adapter1 adapter1;

    private Adapter1 adapter2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        //测试1
       /* initData1();
        addData1ToRecycView();*/

        //测试2
       /* initData2();
        addData2ToRecycView();*/

        //测试一个recyclaerview中同时展示不同的2种数据
        add2DataToRecycView();
    }

    private void initView()
    {
        recyclerView = (RecyclerView)findViewById(R.id.test_recyclerView);
    }

    private void initData1()
    {
        adapter1 = new Adapter1(MainActivity.this);
        List<ViewDataType> SigledataTypes = new ArrayList<>();
        for(int i=0;i<5;i++)
        {
            SigleData sd = new SigleData();

            sd.setName("liu"+i);

            SigledataTypes.add(sd);
        }
        adapter1.addData(SigledataTypes);
    }

    /**
     * 将数据1打到view上
     */
    private void addData1ToRecycView()
    {
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(adapter1);
    }


    private void initData2()
    {
        adapter2 = new Adapter1(MainActivity.this);
        List<ViewDataType> TwodataTypes = new ArrayList<>();
        for(int i=0;i<10;i++)
        {
            TwoData sd = new TwoData();

            sd.setName("yang"+i);
            sd.setSex( i % 2 ==0? "男":"女");

            TwodataTypes.add(sd);
        }
        adapter2.addData(TwodataTypes);
    }

    /**
     * 将数据2打到view上
     */
    private void addData2ToRecycView()
    {
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(adapter2);
    }


    private void add2DataToRecycView()
    {
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));


        adapter2 = new Adapter1(MainActivity.this);
        //第一中数据
        List<ViewDataType> TwodataTypes = new ArrayList<>();
        for(int i=0;i<10;i++)
        {
            TwoData sd = new TwoData();

            sd.setName("yang"+i);
            sd.setSex( i % 2 ==0? "男":"女");

            TwodataTypes.add(sd);
        }
        adapter2.addData(TwodataTypes);


        //第二种数据
        List<ViewDataType> SigledataTypes = new ArrayList<>();
        for(int i=0;i<5;i++)
        {
            SigleData sd = new SigleData();

            sd.setName("liu"+i);

            SigledataTypes.add(sd);
        }
        adapter2.addData(SigledataTypes);

        recyclerView.setAdapter(adapter2);

    }
}


源码:http://download.csdn.net/detail/d06110902002/9688344



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值