RecyclerView基本使用二

一、使用单布局和设置点击事件,R.layout.item_text布局文件,new DataFactory().setSingleData()数据源,String数据类型,this上下文, holder.setText(R.id.item_text_tv, s);设置数据。

RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv);
rv.setLayoutManager(new LinearLayoutManager(this));
CommonAdapter adapter = null;
rv.setAdapter(adapter = new CommonAdapter<String>(this, R.layout.item_text, new DataFactory().setSingleData()) {
    @Override
    protected void convert(ViewHolder holder, String s, int position) {
        holder.setText(R.id.item_text_tv, s);
    }
});
adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {

    public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
        Toast.makeText(SecondActivty.this, "Click:" + position, Toast.LENGTH_SHORT).show();
    }

    public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {

        Toast.makeText(SecondActivty.this, "Long:" + position, Toast.LENGTH_SHORT).show();

        //return false;//如果返回false的话,按住响应长按事件,后响应点击事件
        return true;//可以区分长按还是点击事件
    }
});

二、多布局的实现,很高明、多条目很清楚实现了分离和关联。

RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new MultAdapter(this, new DataFactory().setMultData()));

MultAdapter.calss继承MultiItemTypeAdapter,后面的BaseCell是多条目的基类,TextCell.class、ImageCell.calss、TextImageCell正是对应绑定和加入各自对应的布局文件

public class MultAdapter extends MultiItemTypeAdapter<BaseCell> {
    public MultAdapter(Context context, List<BaseCell> datas) {
        super(context, datas);

        //添加三种布局
        addItemViewDelegate(new TextCell());
        addItemViewDelegate(new ImageCell());
        addItemViewDelegate(new TextImageCell());
    }
}

BaseCell.class把一些共性可以抽取,其实也没什么东西。 

public class BaseCell {

    protected String type;
    protected String text;
    protected String url;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public BaseCell() {
    }

    public BaseCell(String type, String text, String url) {
        this.type = type;
        this.text = text;
        this.url = url;
    }
}

这下面几个子类实现的正是关键部分

public class TextImageCell implements ItemViewDelegate<BaseCell> {
    @Override
    public int getItemViewLayoutId() {
        return R.layout.item_text_image;
    }

    @Override
    public boolean isForViewType(BaseCell item, int position) {
       
        return "TextImageDataType".equals(item.getType());
    }

    @Override
    public void convert(ViewHolder holder, BaseCell baseCell, int position) {

        //设置数据
        holder.setText(R.id.item_text_image_tv, baseCell.getText());
        holder.setImage(R.id.item_text_image_iv, baseCell.getUrl());
    }
}

getItemViewLayoutId返回的是对应布局文件,isForViewType这个方法这是根据当前item判断是不是这个属于布局的类型。我设置了三种布局,对应三种类型,这个类中的类型是TextImageDataType,与item中表明类型的对比,确认是不是把数据加载到这个布局上。

public class ImageCell implements ItemViewDelegate<BaseCell> {
    @Override
    public int getItemViewLayoutId() {
        return R.layout.item_image;
    }

    @Override
    public boolean isForViewType(BaseCell item, int position) {
        //返回true,表示使用布局
        return item.getType().equals("ImageDataType");
    }

    @Override
    public void convert(ViewHolder holder, BaseCell baseCell, int position) {

        //设置数据
        holder.setImage(R.id.item_image_iv,baseCell.getUrl());

    }
}
public class TextCell implements ItemViewDelegate<BaseCell> {
    @Override
    public int getItemViewLayoutId() {
        return R.layout.item_text;
    }

    @Override
    public boolean isForViewType(BaseCell item, int position) {
        //返回true,表示使用布局
        return "TextDataType".equals(item.getType());
    }

    @Override
    public void convert(ViewHolder holder, BaseCell baseCell, int position) {

        //设置数据
        holder.setText(R.id.item_text_tv,baseCell.getText());

    }
}

在数据源上,会明确指出属于那种类型的。下面是模拟的数据源。

public class DataFactory {

    //设置文本数据布局
    class TextData extends BaseCell {

        public TextData(String type, String text) {
            super.type = type;
            super.text = text;
        }

    }

    //设置图片数据布局
    class ImageData extends BaseCell {

        public ImageData(String type, String url) {
            super.type = type;
            super.url = url;
        }

    }

    //设置文本图片数据布局
    class TextImageData extends BaseCell {

        public TextImageData(String type, String text, String url) {
            super(type, text, url);
        }
    }


    public List<String> setSingleData() {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add(String.valueOf(i));
        }
        return list;
    }

    public List<BaseCell> setMultData()

    {
        ArrayList<BaseCell> list = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            int dataType = new Random().nextInt(3);//0、1、2
            switch (dataType) {
                case 0:
                    list.add(new TextData("TextDataType", "文本数据源设置:" + i));
                    break;
                case 1:
                    list.add(new ImageData("ImageDataType", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3844734607,745865640&fm=26&gp=0.jpg"));
                    break;
                case 2:
                    list.add(new TextImageData("TextImageDataType", "图片数据源设置:" + i,"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1497248936253&di=2546b56bf27d9f7484ef8d3132c988d5&imgtype=0&src=http%3A%2F%2Fww1.sinaimg.cn%2Fbmiddle%2F8154ee06gw1ep7ficdmbkj20dw0ae3zm.jpg"));
                    break;
            }
        }
        return list;

    }
}

三、添加头布局、脚布局

RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv);
rv.setLayoutManager(new LinearLayoutManager(this));
MultAdapter mAdapter = new MultAdapter(this, new DataFactory().setMultData());
//在RecyclerView设置adpter之后
mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter);
View headView = LayoutInflater.from(this).inflate(R.layout.item_header, null);
ImageView iv_head = (ImageView) headView.findViewById(R.id.iv_head);
Picasso.with(SecondActivty.this).load(DataFactory.url2).resize(getResources().getDisplayMetrics().widthPixels,200).into(iv_head);
mHeaderAndFooterWrapper.addHeaderView(headView);
mHeaderAndFooterWrapper.addFootView(headView);
rv.setAdapter(mHeaderAndFooterWrapper);

使用包装之后的adapter

rv.setAdapter(mHeaderAndFooterWrapper);

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3015461/blog/919789

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值