2013-07-02 118 views
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的是succefully插在單擊的項目。但是,當我向下滾動列表時,我意識到在滾動列表之前點擊的位置上的所有其他元素也改變了圖像資源。

爲什麼會發生?我猜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); 
    } 
+0

正如你發現的,視圖在ListViews中被回收。我會做我自己的自定義適配器並重寫getView()並將選擇邏輯放在那裏。 –

+0

實際上這個列表已經在一個適配器中,我也有getView方法。可以發佈一段代碼來說明你剛剛說的嗎?需要將參數ta傳遞給getView是int位置,View convertView,ViewGroup parent –

+0

如果再次單擊該項目,會發生什麼情況?該圖標是否應該改回來,還是隻保持設置? –

回答

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時點擊元素的資源

0

如果您使用的是有對象的列表中的適配器,您可以使用:

getItem(position)然後改變這個特定對象的imageview的形象

+0

之前設置的資源圖片謝謝!但getItem只返回列表中表示哪個元素的對象。我應該看到與這個對象有關的視圖,不是嗎? –

+0

你的UI如何初始化?發表你的代碼(對象/適配器) – marshallino16

+0

我用適配器 –

相關問題