我有自定义列表视图,每行有一个TextView和一个ImageView。 我想当用户点击行时,行的图像发生了变化。
以下是我写的代码。
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
img = (ImageView) view.findViewById(R.id.imageseleckted);
Toast.makeText(MainActivity.this, String.valueOf(id), Toast.LENGTH_SHORT).show();
if (SmsMultiCasting.selectedRow[(int)id] == 0) {
img.setImageResource(R.drawable.tik);
SmsMultiCasting.selectedRow[(int)id] = 1;
} else {
SmsMultiCasting.selectedRow[(int)id] = 0;
img.setImageResource(R.drawable.uncheck);
}
}
但是当我点击下一行第10行和下一行10时依旧改变图片时,
如何定义只选择行更改图像?
答案 0 :(得分:1)
这里最适合的设计模式是使用ViewHolder。您可以使用视图持有者处理点击事件。自定义适配器代码
public class CustomListAdapter extends BaseAdapter {
private ArrayList listData;
private LayoutInflater layoutInflater;
public CustomListAdapter(Context context, ArrayList listData) {
this.listData = listData;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
holder = new ViewHolder();
holder.headlineView = (TextView) convertView.findViewById(R.id.title);
holder.reporterNameView = (TextView) convertView.findViewById(R.id.reporter);
holder.reportedDateView = (TextView) convertView.findViewById(R.id.date);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.headlineView.setText(listData.get(position).getHeadline());
holder.reporterNameView.setText("By, " + listData.get(position).getReporterName());
holder.reportedDateView.setText(listData.get(position).getDate());
holder.headlineView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// handle your click event here
}
});
return convertView;
}
static class ViewHolder {
TextView headlineView;
TextView reporterNameView;
TextView reportedDateView;
}
}
您可以在这里查看完整的教程Android ListView Tutorial
答案 1 :(得分:0)
当您的适配器为您提供下一行时,它会尝试重新使用一些旧的,不需要的视图。因此,当重新使用此类视图时,它会保留之前所做的所有更改,直到它们在适配器中手动取消。因此,每个10(它取决于列表大小,我可以看到)行实际上共享相同的视图。
答案 2 :(得分:0)
在onItemClick中,一旦用户选择任何行,您必须将所有图像重置为默认状态,然后更改所选行的图像。按照您已经完成的操作,设置或重置数组中单击的位置然后调用notifydatasetchanged。然后在你的getView()中你必须检查数组并设置相应的图像。
答案 3 :(得分:0)
视图在ListViews中被回收,以不同的方式检查以下帖子但应该有效.. Listview
答案 4 :(得分:0)
我认为您可以在列表视图中使用OnItemClickListener中的文本并获取所选行的文本。并使用它来改变图像。请参阅以下链接: