Android:OnClick ImageView无法更改正确的图像

时间:2014-04-10 08:48:05

标签: android listview onclick imageview

我正在创建一个自定义Listview中有图像的应用。数据库放了一张图片。单击图像必须更改。但是当我点击图像时,没有在正确的ImageView上更改。它改变了其他ImageView。

我需要任何帮助。感谢

public View getView(final int position, View convertView, ViewGroup parent) {

    View v = convertView;

    final MonumentosHolder holder = new MonumentosHolder();

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.listview_row, null);

        TextView tv = (TextView) v.findViewById(R.id.textoListviewNombre);
        ImageView img3 = (ImageView) v.findViewById(R.id.imagenVisto);

        holder.texto = tv;
        holder.imagenVisto = img3;

        v.setTag(holder);
    }
    else {
        holder = (MonumentosHolder) v.getTag();
    }

            holder.position = position;

            final MonumentosObj p = monumentosLista.get(position);

    holder.texto.setText(p.getNombre());

    if (p.getVisto().equals("n")) {
        holder.imagenVisto.setImageResource(R.drawable.vistorojo);
    } else {
        holder.imagenVisto.setImageResource(R.drawable.vistoverde); 
    }

    holder.imagenVisto.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            MonumentosObj p1 = monumentosLista.get(holder.position);

            if (p1.getVisto().equals("s")) {

                holder.imagenVisto.setImageResource(R.drawable.vistorojo);
                p1.setVisto("n");

            } else {

                holder.imagenVisto.setImageResource(R.drawable.vistoverde);
                p1.setVisto("s");

            }

            MonumentosAdapter.updateMonumentos(p1);
            MonumentosObj p = monumentosLista.get(holder.position);
        }
    });

    imageLoader.displayImage(imageUrls[position], holder.imagen, options, animateFirstListener);

    return v;
}

修改

Onclick不会更改正确的图像。但是当我将listview滚动到下面并返回顶部时,正确的图像已经改变了......

3 个答案:

答案 0 :(得分:0)

尝试改变

holder.imagenVisto.setOnClickListener(new View.OnClickListener() 

通过

holder.imagenVisto.setOnClickListener(new OnClickListener()

答案 1 :(得分:0)

我认为这段代码可能是错误的:

holder.imagenVisto.setOnClickListener(new View.OnClickListener() {

    private int pos = position;

    @Override
    public void onClick(View v) {

        MonumentosObj p1 = monumentosLista.get(pos);

尝试将位置存储在持有者对象内,并在onClick Listener中进行分配

 private int pos = position;

DO

private int pos = holder.getPosition()

请记住,Android ListViews 一次加载所有项目它只是加载可见的内容和除此之外的少数项目,

还要记住你的数组中你的项目的位置没有改变,你可能会以某种方式使用它:)

答案 2 :(得分:0)

我认为您的点击监听器会影响列表中的早期项目!

这样做:

在你的viewHolder中添加一个长项:

class MonumentosHolder {
    .
    .
    .
    long position;
}

然后在你的getView中设置持有者位置:

View v = convertView;

<强> - 编辑 -    最终MonumentosHolder holder = new MonumentosHolder(); - END EDITED -

if (convertView == null) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.listview_row, null);

    TextView tv = (TextView) v.findViewById(R.id.textoListviewNombre);
    ImageView img3 = (ImageView) v.findViewById(R.id.imagenVisto);

    holder.texto = tv;
    holder.imagenVisto = img3;

    v.setTag(holder);
}
else {
    holder = (MonumentosHolder) v.getTag();
}
 **holder.postion = position;**

然后点击监听器就像这样:

<强> EDITED  holder.imagenVisto.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View v) {

        MonumentosObj p1 = monumentosLista.get(**holder.position**);

        if (p1.getVisto().equals("s")) {

            holder.imagenVisto.setImageResource(R.drawable.vistorojo);
            p1.setVisto("n");

        } else {

            holder.imagenVisto.setImageResource(R.drawable.vistoverde);
            p1.setVisto("s");

        }

        MonumentosAdapter.updateMonumentos(p1);
        MonumentosObj p = monumentosLista.get(holder.position);
    }
});

编辑4 从持有者中删除最终修饰符,定义另一个名为finalHolder的MonumentosHolder,如下所示:

public View getView(final int position,View convertView,ViewGroup parent){     查看v = convertView;

MonumentosHolder holder = new MonumentosHolder();

if (convertView == null) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.listview_row, null);

    TextView tv = (TextView) v.findViewById(R.id.textoListviewNombre);
    ImageView img3 = (ImageView) v.findViewById(R.id.imagenVisto);

    holder.texto = tv;
    holder.imagenVisto = img3;

    v.setTag(holder);
}
else {
    holder = (MonumentosHolder) v.getTag();
}

        holder.position = position;

        final MonumentosObj p = monumentosLista.get(position);

holder.texto.setText(p.getNombre());

if (p.getVisto().equals("n")) {
    holder.imagenVisto.setImageResource(R.drawable.vistorojo);
} else {
    holder.imagenVisto.setImageResource(R.drawable.vistoverde); 
}

final MonumentosHolder finalHolder = holder;
holder.imagenVisto.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        MonumentosObj p1 = monumentosLista.get(finalHolder.position);

        if (p1.getVisto().equals("s")) {

            holder.imagenVisto.setImageResource(R.drawable.vistorojo);
            p1.setVisto("n");

        } else {

            holder.imagenVisto.setImageResource(R.drawable.vistoverde);
            p1.setVisto("s");

        }

        MonumentosAdapter.updateMonumentos(p1);
        MonumentosObj p = monumentosLista.get(finalHolder.position);
    }
});

imageLoader.displayImage(imageUrls[position], holder.imagen, options, animateFirstListener);

return v;

}