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 メソッドには、次のロジックがあります (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の場合にクリックされた要素の画像リソースのみを設定します

于 2013-07-02T15:44:00.383 に答える