0

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

然后我在这个视图上有一个 onItemClickListener。我想在项目单击时更改右侧 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);
    }
4

2 回答 2

1

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

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

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

我在监听器中调用了getView方法来刷新列表,因为getView调用了一个方法(我接下来会解释)来更新列表。在适配器类的 getView 方法中,我有以下逻辑(位置元素来自 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时设置单击元素的图像资源

于 2013-07-02T15:44:00.383 回答
0

如果您使用带有对象列表的适配器,则可以使用:

getItem(position)然后改变这个特定对象的imageview的图像

于 2013-07-02T14:27:02.467 回答