我为ArrayAdapter
制作了一个自定义ListView
,它会更改所点击行的资源视图(当您点击它时模拟某种展开行)。使用OnItemClickListener
我观察点击并将点击位置设置为适配器。然后我告诉适配器数据已更改。然后适配器更新,并使用简单的if语句在单击的位置上使用不同的资源视图。最后一次点击发生的视图返回其初始“未展开”状态。如果我让适配器从头开始充气每个视图,这工作正常。这是我用于此的MyAdapter
类的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
LayoutInflater inf = ((Activity) mContext).getLayoutInflater();
if(clickposition == position){
row = inf.inflate(R.layout.expandedoverviewrow, parent, false);
}
else{
row = inf.inflate(R.layout.overviewrow, parent, false);
}
TextView txtPayedby = (TextView)row.findViewById(payedbyId);
TextView txtAmount = (TextView)row.findViewById(amountId);
TextView txtDate = (TextView)row.findViewById(dateId);
TextView txtDescript = (TextView)row.findViewById(descriptId);
TextView txtPersons = (TextView)row.findViewById(personId);
txtPayedby.setText(payedbyList.get(position));
txtAmount.setText(amountList.get(position));
txtDate.setText(dateList.get(position));
txtDescript.setText(descriptList.get(position));
txtPersons.setText(personList.get(position));
return(row);
}
public void clicked(int position){
clickposition = position;
}
如果我想要回收视图,那就错了。随机行获得“扩展”视图,因为它正在回收视图。如果我使用上面的代码,这是预期的。我尝试更改代码以区分convertView
是正常视图还是“扩展”视图。我这样做是通过将代码的第一部分更改为:
View row = convertView;
if{row == null || ......){
LayoutInflater inf = ((Activity) mContext).getLayoutInflater();
row = inf.inflate(R.layout.overviewrow, parent, false);
}
if(clickedposition == position){
LayoutInflater inf = ((Activity) mContext).getLayoutInflater();
row = inf.inflate(R.layout.expandedoverviewrow, parent, false);
}
在第一个if语句中的多个点我想检查视图是否是“展开”视图。我尝试了各种各样的东西,将getId与资源ID进行比较,将内容描述与字符串进行比较。将convertView与将使用inflater创建的视图进行比较。所有都无法检测到视图是正常视图还是“扩展”视图。导致操作系统回收视图,从而使越来越多的“扩展”视图成为行。
有谁知道一种能够检测不同视图的方法吗?或者在这种情况下更好的是不回收视图?
答案 0 :(得分:1)
......或者在这种情况下,不回收视图会更好吗?
始终的目标是使用ListView
的循环机制,下面是我将如何做(你实现getView
方法的逻辑有点奇怪)。首先,我将使用适配器的getItemViewType
和getViewTypeCount
方法。它们看起来像这样:
@Override
public int getItemViewType(int position) {
if (clickposition != -1 && position == clickposition) {
return SPECIAL_VIEW;
}
return NORMAL_VIEW;
}
@Override
public int getViewTypeCount() {
return 2; // we have two types of views
}
其中NORMAL_VIEW
和SPECIAL_VIEW
是两种类型的行(正常行和扩展行):
// fields in your adapter class
public static final int NORMAL_VIEW = 0;
public static final int SPECIAL_VIEW = 1;
使用上面的所有代码,getView
方法将如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int whichOne = getItemViewType(position);
if (convertView == null) {
switch (whichOne) {
case NORMAL_VIEW:
convertView = mInflater.inflate(R.layout.overviewrow, parent, false);
break;
case SPECIAL_VIEW:
convertView = mInflater.inflate(R.layout.expandedoverviewrow, parent, false);
break;
}
} else {
// there is no else, the getItemViewType will make sure that you have a valid view
}
// then you would set the data based on the value of whichOne
//...
当您点击某个项目时,更新clickposition
并在适配器上调用notifyDataSetChanged
,以便它可以调整行。