Mar*_*ark 7 android android-arrayadapter android-listview android-viewholder
我有个问题.点击后我试图在列表视图中更改图标.它可以正常工作,虽然不会仅修改点击的图标,但也不会修改那些未显示的图标.例如,如果我单击列表视图的第一项中的图标,则第五个图标也会更改.对于以下所有项目(列表视图的每五个项目)重复此行为.这是我的getView方法:
public class AlphabeticalAdapter extends ArrayAdapter<String>
{
int layoutResourceId;
private final Context context;
private List<String> data;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;
public AlphabeticalAdapter(Context context, int resource, List<String> data){
super(context, resource, data);
this.layoutResourceId = resource;
this.context = context;
this.data = data;
}
public View getView(int position, View convertView, ViewGroup parent) {
// View rowView = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.catalogslist_single_row, parent, false);
viewHolder = new ViewHolder();
viewHolder.catlogTitle=(TextView)convertView.findViewById(R.id.txtTitle);
viewHolder.icon=(ImageView)convertView.findViewById(R.id.imageView2);
viewHolder.downloadImageButton=(ImageView)convertView.findViewById(R.id.downloadImageButton);
//downloadImageButton = (ImageView)rowView.findViewById(R.id.downloadImageButton);
viewHolder.position = position;
viewHolder.downloadImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("DOWNLOAD PRESSED");
viewHolder.downloadImageButton = (ImageView)v.findViewById(R.id.downloadImageButton);
viewHolder.downloadImageButton.setImageResource(R.drawable.icon_ok);
viewHolder.downloadImageButton.setTag("downloaded");
//rowView.setTag("downloaded");
}
});
convertView.setTag(viewHolder);
}
else{
viewHolder= (ViewHolder)convertView.getTag();
}
viewHolder.catlogTitle.setText(data.get(position));
viewHolder.catlogTitle.setTypeface(regularDin);
viewHolder.icon.setImageResource(R.drawable.cata);
if(viewHolder.downloadImageButton.getTag() == "downloaded"){
downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
downloadImageButton.setImageResource(R.drawable.icon_ok);
}
else{
downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
downloadImageButton.setImageResource(R.drawable.icon_download);
}
viewHolder.position = position;
return convertView;
} //close getView
Run Code Online (Sandbox Code Playgroud)
...
这是我的ViewHolder类:
static class ViewHolder{
ImageView downloadImageButton;
TextView catlogTitle;
ImageView icon;
int position;
}
Run Code Online (Sandbox Code Playgroud)
小智 10
在下面更改您的代码.我想你错过了.
public class AlphabeticalAdapter extends ArrayAdapter<String> {
int layoutResourceId;
private final Context context;
private List<String> data;
private List<String> tags;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;
public AlphabeticalAdapter(Context context, int resource, List<String> data) {
super(context, resource, data);
this.layoutResourceId = resource;
this.context = context;
this.data = data;
tags = new ArrayList<String>();
int size = data.size();
for (int i = 0; i < size; i++) {
tags.add("tag");
}
}
static class ViewHolder {
ImageView downloadImageButton;
TextView catlogTitle;
ImageView icon;
int position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
// View rowView = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// convertView = inflater.inflate(R.layout.catalogslist_single_row,
// parent, false);
viewHolder = new ViewHolder();
viewHolder.position = position;
viewHolder.downloadImageButton
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("DOWNLOAD PRESSED");
viewHolder.downloadImageButton.setTag("downloaded");
tags.add(position, "downloaded");
}
});
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.catlogTitle.setText(data.get(position));
viewHolder.catlogTitle.setTypeface(regularDin);
viewHolder.icon.setImageResource(R.drawable.cata);
if (tags.get(position) == "downloaded") {
downloadImageButton.setImageResource(R.drawable.icon_ok);
} else {
downloadImageButton.setImageResource(R.drawable.icon_download);
}
viewHolder.position = position;
return convertView;
} // close getView
}
Run Code Online (Sandbox Code Playgroud)
有许多convertViews许多排在同一时间看到你的ListView(系统会重复使用它).所以你实际上有5个convertView,因此你有5个ImageView图标.问题是您使用这些ImageView的标签来存储"已下载"的信息.这是5状态,这就是为什么你在列表中滚动时看到每下载第五行的原因.
我想你现在看到它不会起作用.您需要为每个项目存储下载的状态,因此您必须更改底层,List<String>以便List<ListItem>在哪里ListItem可以存储实际行的下载状态.
之后,您所要做的就是更新convertView's ImageView(in getView())以显示正确的图标.
| 归档时间: |
|
| 查看次数: |
31642 次 |
| 最近记录: |