1

我有自定义列表视图,每一行都有一个 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等时也会改变图片,

如何定义仅选定的行更改图像?

4

5 回答 5

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 教程

于 2013-08-12T06:04:05.393 回答
0

视图在 ListViews 中被回收,检查以下帖子以不同的方式但应该可以工作.. Listview

于 2013-08-12T05:55:04.120 回答
0

我认为您可以在列表视图中使用 OnItemClickListener 中的文本并获取所选行的文本。并使用它来更改图像。请参阅以下链接:

关联

于 2013-08-12T05:57:09.270 回答
0

当您的适配器为您提供下一行时,它会尝试重新使用一些旧的、不需要的视图。因此,当此类视图被重用时,它会保留之前所做的所有更改,直到它们在适配器中手动取消。因此,每 10 行(它取决于列表大小,如我所见)实际上共享相同的视图。

于 2013-08-12T05:52:24.637 回答
0

在您的 onItemClick 中,一旦用户选择任何行,您必须将所有图像重置为默认状态,然后更改所选行的图像。否则,正如您已经完成的那样,设置或重置数组中的单击位置并调用 notifydatasetchanged .然后在您的 getView() 中,您必须检查数组并设置相应的图像。

于 2013-08-12T05:54:45.753 回答