Question

I have a custom listview which has an ImageView on the left, followed by a EditText and on the right I have another ImageView which, at first, has not any source.

Then I have an onItemClickListener on this View. I would like to change the source of the ImageView on the right (the one that initially hasn't any source) on the item click.

For this I have implemented this code:

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          ImageView icone2 = (ImageView) view.findViewById(R.id.icone2_lugar);
          icone2.setImageResource(R.drawable.flag_origem);
    }

The ImageView is succefully inserted on the item clicked. However, when I scroll down the list, I realized that all the other elements which were at the same position of the one clicked before I scroll the list, also changed the image resource.

Why is it happening? I guess Android loads new views as scroll the list instead of loading all elements views at the same moment, so I guess I can't change the resource of a element in a list by taking the View parameter of onItemClick.

So how could I change the resource of the clicked element in a list view?

EDIT:

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

        View linha = convertView;
        ArmazenadorLugar armazenador = null;

        if (linha == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            linha = inflater.inflate(R.layout.linha_lugar, parent, false);
            armazenador = new ArmazenadorLugar(linha);
            linha.setTag(armazenador);
        } else {
            armazenador = (ArmazenadorLugar) linha.getTag();
        }

         armazenador.popularFormulario(mListaLugares.get(position), mContext);

        return linha;
    }

    public LugarAndroid getItem(int position) {
        return mListaLugares.get(position);
    }
Was it helpful?

Solution

I ended up doing it in a different way. Don't know if it is the better but it works.

I created a variable (imgPosition) in my adapter which will hold the element position which has to set the image resource. Then, whenever I click onto an element, the listener calls

   adapter.setImgPosition(position);
   adapter.getView(position, view, parent);

I called the getView method in the listener to refresh the list, because getView calls a method (I'll explain it next) to update the list. In the getView method of the adapter class I have the following logic (the position element comes from getView parameter):

    holder.setValues(mListaLugares.get(position), mContext, imgPosition == position);

In the holder:

static class Holder{
        private TextView txt1= null;
        private ImageView img1 = null;
        private ImageView img2 = null;

        Holder(View linha) {
            txt1= (TextView) linha.findViewById(R.id.txt1);
            img1 = (ImageView) linha.findViewById(R.id.img1 );
            img2 = (ImageView) linha.findViewById(R.id.img2);
        }

        void setValues(LugarAndroid lugar, Context mContext, boolean setImg) {
            img2.setImageResource(0);
            if(setImg) img2.setImageResource(R.drawable.flag);

            // Logic to fill up the others views
        }

This way I will only set the image resource of the element clicked when the boolean passed is true

OTHER TIPS

If you are using an adapter with a List of Object, you can use :

getItem(position) and then change the image of the imageview of this specific object

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top