Android 如何在recyclerview viewholder中处理许多不同的视图类型
如果我有50种视图呢?我的适配器中应该有50个静态内部类吗? 据报道,是的 我的第一个想法是将每个viewholder内部类移动到一个单独的公共类中,但它们必须是静态的。那么,将每个类封装到一个公共类中,使内部类保持静态?还有更好的选择吗 编辑: 代码示例: 所以这是一个很好的解决方案?这不也会影响性能吗Android 如何在recyclerview viewholder中处理许多不同的视图类型,android,adapter,android-recyclerview,Android,Adapter,Android Recyclerview,如果我有50种视图呢?我的适配器中应该有50个静态内部类吗? 据报道,是的 我的第一个想法是将每个viewholder内部类移动到一个单独的公共类中,但它们必须是静态的。那么,将每个类封装到一个公共类中,使内部类保持静态?还有更好的选择吗 编辑: 代码示例: 所以这是一个很好的解决方案?这不也会影响性能吗 public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener,
public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
View container;
TextView title;
//called in onCreateViewHolder in adapter
public MainViewHolder(DragSortAdapter adapter, View itemView) {
super(adapter, itemView);
container = itemView.findViewById(R.id.card_root);
title = container.findViewById(R.id.text);
}
//called by onBindViewHolder in adapter
public void setData(Data data) {
title.setText(data.title);
}
}
编辑2:
示例,用于返回viewholder的新实例时
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new MainViewHolder(...);
case 2: return new MainViewHolderOther(...);
...
}
}
您只能使用一个viewHolder内部类来处理许多不同的viewType。首先,您必须使用getItemViewType(viewType)获取项目位置 并且还必须根据viewType位置使用viewHolder 制作一个vieHolder内部类,在该类中,您可以根据项目的位置传递视图和视图类型,并按如下代码所示对布局进行充气。 下面给出了代码示例
public class Adapter extends
RecyclerView.Adapter<Adapter.MyViewholder> {
LayoutInflater inflater;
private Context context;
ArrayList<Detail> data = new ArrayList<Detail>();
public Adapter(Context context, ArrayList<Detail> getdata) {
this.context = context;
inflater = LayoutInflater.from(context);
this.data = getdata;
}
class MyViewholder extends RecyclerView.ViewHolder {
TextView txtRow, txt_rec;
public MyViewholder(View view, int type) {
super(view);
if (type == Constants.NORMAL) {
txtRow = (TextView) view
.findViewById(R.id.txtRow);
} else if (type == Constants.RECORDING) {
txt_rec = (TextView) view
.findViewById(R.id.txt_rec);
}
}
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public void onBindViewHolder(MyViewholder viewholder, int position) {
int listViewItemType = getItemViewType(position);
Detail detail = data.get(listViewItemType);
if (detail.getType() == Constants.NORMAL) {
viewholder.txtRow.setText(detail.getKey());
} else if (detail.getType() == Constants.RECORDING) {
viewholder.txt_rec.setText(detail.getRecording());
}
}
@Override
public MyViewholder onCreateViewHolder(ViewGroup parent, int viewType) {
int listViewItemType = getItemViewType(viewType);
switch (listViewItemType) {
case 0:
view = inflater.inflate(R.layout.detail_item, parent,
false);
myViewholder = new MyViewholder(view, Constants.NORMAL);
case 2:
view = inflater.inflate(R.layout.recording, parent, false);
myViewholder = new MyViewholder(view, Constants.RECORDING);
}
return myViewholder;
}
@Override
public int getItemViewType(int position) {
return position;
}
}
公共类适配器扩展
RecyclerView.适配器{
充气机;
私人语境;
ArrayList数据=新的ArrayList();
公共适配器(上下文,ArrayList getdata){
this.context=上下文;
充气器=充气器。从(上下文);
this.data=getdata;
}
类MyViewholder扩展了RecyclerView.ViewHolder{
TextView txtRow,txt_rec;
公共MyViewholder(视图,int类型){
超级(视图);
if(类型==常量.NORMAL){
txtRow=(TextView)视图
.findviewbyd(R.id.txtRow);
}else if(类型==常量.录制){
txt_rec=(文本视图)视图
.findviewbyd(R.id.txt_rec);
}
}
}
@凌驾
public int getItemCount(){
返回data.size();
}
@凌驾
BindViewHolder上的公共无效(MyViewholder viewholder,int位置){
int listViewItemType=getItemViewType(位置);
Detail Detail=data.get(listViewItemType);
if(detail.getType()==Constants.NORMAL){
viewholder.txtRow.setText(detail.getKey());
}else if(detail.getType()==Constants.RECORDING){
viewholder.txt_rec.setText(detail.getRecording());
}
}
@凌驾
公共MyViewholder onCreateViewHolder(视图组父级,int-viewType){
int listViewItemType=getItemViewType(viewType);
开关(listViewItemType){
案例0:
视图=充气机。充气(R.布局.细节\u项目,父项,
假);
myViewholder=新的myViewholder(视图,常量.NORMAL);
案例2:
视图=充气机。充气(R.layout.recording,parent,false);
myViewholder=新的myViewholder(视图,常量.录制);
}
返回myViewholder;
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
}
希望这段代码能帮助您为什么您认为顶级类不是静态的?你能添加一些代码示例来阐明你的意思吗?为什么它们必须是静态的?@Niekharman顶级公共类在java中不能是静态的。@Tamas顶级类的定义是静态的。并且ViewHolder模式“要求”它,以便ViewHolder实例没有对其外部类的引用。将静态内部ViewHolder类设置为顶级类具有完全相同的结果。如果有20个类型,每个类型有1个项目,
ViewHolder
模式无效。ViewHolder
模式仅在相同的视图
可用于列表视图中的多个项目时才有用。这就提出了一个问题,你是否真的需要这20种类型。例如,不同的背景色不需要是不同的类型。