Android和自定义ListView

时间:2013-08-12 05:40:58

标签: android listview

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

如何定义只选择行更改图像?

5 个答案:

答案 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中的文本并获取所选行的文本。并使用它来改变图像。请参阅以下链接:

Link