Android CustomAdapter的getView()出现意外行为
我有一个像这样的Android CustomAdapter的getView()出现意外行为,android,listview,Android,Listview,我有一个像这样的ViewHolder类 static class ViewHolder { protected String fileName; protected Bitmap bitmap = null; protected CheckBox checkBox; protected int position; protected int resourceId = 0; protected ImageView imageView;
ViewHolder
类
static class ViewHolder {
protected String fileName;
protected Bitmap bitmap = null;
protected CheckBox checkBox;
protected int position;
protected int resourceId = 0;
protected ImageView imageView;
protected TextView textView;
}
在我的getView()中
此时,当我使用notifydatasetchange()
刷新适配器而不更改数据时,通过调用getTag()
得到的ViewHolder
返回了错误的标记。它工作起来就像
如果位置为1,则支架对象位于位置0处的视图中。ie;已返回上一个对象
最后我找到了一个
这是不一样的,但使用相同的方法,解决方案对我有效。。我不知道怎么
解决方案是
在xml中将ListView
的宽度设置为MATCH\u PARENT
,在帖子中是height
有谁知道,这种行为的原因是什么?我在这个问题背后找不到任何逻辑似乎当你不使用这个解决方法时,Android必须多次调整listview的布局,直到它被执行为止。这就是为什么许多用户抱怨getView()
被调用的次数超过了它“应该”的次数
无论如何,请注意,getView()
并不是按顺序调用的,它是按Android确定的顺序调用的,所以不要期望标签按顺序显示
---编辑---
第48页。希望这有帮助 你能发布初始化视图持有者的代码吗?我刚刚更新了整个代码我不知道这方面的准确解释,但我猜当宽度设置为MATCH\u PARENT
(实际上应该如此)时,Android已经正确呈现了布局,之所以按顺序调用它,是因为Android认为每一行都“难以”渲染。另一方面,当设置为WRAP_CONTENT
时,除了显示布局外,每一行都必须呈现为确定的布局,Android在呈现每一行时会处理getView()
,这意味着每一行不必都相等,这就是为什么它不是顺序的。谢谢你试着帮我解释你知道的,可能是这样,但我在寻找一些精确的解决方案,因为这是我们通常在每个程序上工作的,所以我不想在没有知识的情况下做。我刚刚发现:在第48页有一点关于它。遗憾的是,它现在更详细了一点,但给出了一个想法。是的,那太好了。。。应该记录以下假设:(我们如何知道它是否像这样???事实上,有趣的是,我发现这是在寻找一个完全不同的主题:-)我会保留该页面,希望至少其他用户可以帮助你的问题(我投了更高的票)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView != null)
{
ViewHolder holder = (ViewHolder) convertView.getTag();
if(!holder.fileName.equals(fileList.get(position)))
convertView = null;
}
if(convertView == null)
{
convertView = inflater.inflate(R.layout.image_layout, null, false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
viewHolder.textView = (TextView) convertView.findViewById(R.id.text);
// Set viewHolder attributes
viewHolder.position = position;
viewHolder.fileName = fileList.get(position);;
// set the checkbox
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
// Set the path of the file
final String filePath = context.getBasePath(position);
if(new File(filePath).isDirectory())
{
viewHolder.imageView.setImageResource(R.drawable.folder);
viewHolder.resourceId = R.drawable.folder;
}
else
{
String mimeType = Utility.getMimeType(filePath);
if(mimeType.contains("image"))
{
loadImage(viewHolder, viewHolder.imageView, filePath);
}
else
viewHolder.resourceId = handleFile(viewHolder.imageView, filePath);
}
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
if(viewHolder.bitmap == null)
viewHolder.imageView.setImageResource(viewHolder.resourceId);
else
viewHolder.imageView.setImageBitmap(viewHolder.bitmap);
}
viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton checkBox, boolean checked) {
viewHolder.checkBox.setChecked(checked);
listener.onFileStateChanged(viewHolder.position, checked);
}
});
// set the fileName
viewHolder.textView.setText(viewHolder.fileName);
if(checkBoxVisibility)
viewHolder.checkBox.setVisibility(View.VISIBLE);
else
viewHolder.checkBox.setVisibility(View.INVISIBLE);
return convertView;
}