栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RecyclerView显示不同item的解决办法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RecyclerView显示不同item的解决办法

RecyclerView显示不同item的解决办法

recyclerview和adapter使用方法很简单,在此不再赘述。
当RecyclerView需要显示不同item时,一般来说有两种解决方法。
场景示例:假设列表中需要显示音乐和广告,实体如下

public class Music{
 private String name;
 //...省略其他信息}
public class Ad{
private String merchant;
private String content;
//...省略其他信息}
方法一:

在一个xml文件中绘制两种item显示样式,不需要哪个就让哪个gone掉,具体方法如下



      
   	        
      

      
   	        
               
      

在onBindViewHolder中根据需要让另一个类型gone掉就可以了

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
        ExampleItem item = getItem(position);
        if(item instanceof Music){
        	holder.llMusic.setVisibility(View.VISIBLE);
        	holder.llAd.setVisibility(View.GONE);
        	//进行其他视图显示设置
        } else {
        	holder.llMusic.setVisibility(View.GONE);
        	holder.llAd.setVisibility(View.VISIBLE);
        	//进行其他视图显示设置
        }
    }

但是这个方法有一个缺点,就是效率不高造成资源浪费,原因是每一个item都有llMusic和llAd,但其实每个item只需要显示其中一个。

方法二:

总体思路:创建两个资源文件item和两个ViewHolder,在adapter中根据viewType创建对应的viewHolder。
item_music.xml


 
	       
 

item_ad.xml


 
	       
            
 

创建两个viewHolder类:
先创建一个抽象基类baseViewHolder

private abstract class baseViewHolder extends RecyclerView.ViewHolder{
	public baseViewHolder(View itemView){
		super(itemView);
	}
}

再分别创建两个ViewHolder继承baseViewHolder

private class MusicViewHolder extends baseViewHolder{
	TextView name;
	public MusicViewHolder(View itemView){
		super(itemView);
		name = (TextView) itemView.findViewById(R.id.tvName);
		}
	} 
private class AdViewHolder extends baseViewHolder{
	TextView merchant;
	TextView content;
	public AdViewHolder(View itemView){
		super(itemView);
		merchant= (TextView) itemView.findViewById(R.id.tvMerchant);
		content= (TextView) itemView.findViewById(R.id.tvContent);
		}
	} 

在adapter中的用法

@Override
public int getItemViewType(int position){
	if(data.getItem(position) instanceof Music){
		return R.layout.item_music;
	}else return R.layout.item_ad;
}

@Override
public void onBindViewHolder(baseViewHolder holder, int position){
	Object item = data.get(position);
	if (item instanceof Music){
		//设置相关内容
	}else{
		//设置相关内容
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号