如何更改列表视图中单击的项目的图像资源

时间:2013-07-02 14:12:08

标签: android listview view imageview onitemclicklistener

我有一个自定义列表视图,左边是ImageView,后面是EditText,右边是另一个ImageView,起初没有任何来源。

然后我在这个View上有一个onItemClickListener。我想在项目点击时更改右侧的ImageView源(最初没有任何源的ImageView)。

为此我已实现此代码:

    @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);
    }

在单击的项目上成功插入ImageView。但是,当我向下滚动列表时,我意识到在滚动列表之前所有其他元素位于单击的位置,也改变了图像资源。

为什么会这样?我想Android会加载新视图作为滚动列表而不是同时加载所有元素视图,所以我想我不能通过获取onItemClick的View参数来更改列表中元素的资源。

那么如何在列表视图中更改被点击元素的资源呢?

编辑:

@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);
    }

2 个答案:

答案 0 :(得分:1)

我最后以不同的方式做到了。不知道它是否更好但是有效。

我在我的适配器中创建了一个变量(imgPosition),它将保存必须设置图像资源的元素位置。然后,每当我点击一个元素时,监听器就会调用

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

我在侦听器中调用了getView方法来刷新列表,因为getView调用了一个方法(我接下来会解释它)来更新列表。 在适配器类的getView方法中,我有以下逻辑(position元素来自getView参数):

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

持有人:

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
        }

这样我只会在传递的布尔值为true时设置被点击元素的图像资源

答案 1 :(得分:0)

如果您使用带有List of Object的适配器,则可以使用:

getItem(position)然后更改此特定对象的imageview图像