通常,适配器会使用它来优化listview的性能:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item1, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(mData.get(position));
return convertView;
}
并且查看持有人是:
public static class ViewHolder {
public TextView textView;
}
但是如果我有不同类型的行,例如1带有ImabeView,1带有CheckBox,1带有EditText
第一件事是:
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
//if something
return 0
//if something else
return 1
//if something different
return 2
}
和getView();
getView(int position, View convertView, ViewGroup parent){
//if convetView == null, getItemViewType(position) and depending on the type inflate respective layout
convertView.setTag(holder);
//else
holder = (ViewHolder)convertView.getTag();
}
但ViewHolders怎么样,我应该有3个不同的ViewHolders,并且根据类型........ setTag为各个Holder?
我可以找到类似这样的例子。实际上我还没有看过使用超过1个ViewHolder的anu ListView。
我是以正确的方式做的吗?
谢谢
答案 0 :(得分:8)
没有什么能阻止您在单个ListView
课程中声明所有ViewHolder
布局中的所有可能观看次数(因此ViewHolder
将保留对来自您示例的ImageView
,CheckBox
和EditText
。
在getView
为convertView
null
方法的ViewHolder
方法中,您将仅针对该类型的行设置ViewHolder
中的视图,null
中的所有其他视图引用{1}}将ViewHolder
。如果您有时间使用ViewHolder
中的观看次数,只需查看您的工作类型,只能从属于该行的ViewHolder
获取观看次数。
您还可以为每种类型的行使用三个{{1}}类(并在为它们充气时为每个特定行设置它们),但我认为第一个版本更好。最后,只要正确实现多行类型机制,就可以采用任何一种方式。
答案 1 :(得分:1)
- 我相信不 3 rows
,但单 row
3 不同部件强>
- 您需要具有 3个不同组件的单个holder class
。
请参阅以下链接中的此示例:
答案 2 :(得分:0)
我是第二个Kumar Vivek Mitra。 你需要有一行包含所有3个视图在另一个下面。 如果你想要不同的行,那么试试这个:
- create a custom row and put all the 3 views in it.
- set the visibility of all these views to GONE
- get the reference of all three views in ViewHolder.
- when setting the list, change the visibility of those views which you want to show to VISIBLE.