1

我有一個自定義arrayadapter,我想爲其每行中的按鈕添加一個onclicklistener,當我單擊按鈕我想要更改圖像資源時,所有內容除了當我點擊一個按鈕時,圖像會改變,但另一行中另一個按鈕的圖像也會改變。謝謝你的幫助 ! 這裏是我的代碼:自定義arrayadapter和onclicklistener爲一行中的按鈕

public class Coursadapter extends ArrayAdapter<String>{ 

    Context context; 
    int layoutResourceId;  
    ArrayList<String> data = null; 
    WeatherHolder holder; 

    public Coursadapter(Context context, int layoutResourceId, ArrayList<String> data) { 
     // super(context, layoutResourceId, data, coeff); 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 

    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 


     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new WeatherHolder(); 
      holder.name = (TextView)row.findViewById(R.id.item_cours_name); 
      holder.b=(ImageButton) row.findViewById(R.id.button); 
      holder.b.setTag(holder); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (WeatherHolder)row.getTag(); 
     } 

     holder.b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       WeatherHolder w = (WeatherHolder) v.getTag(); 
       w.b.setImageResource(R.drawable.butgreen); 


      } 
     }); 
     String name1 = data.get(position); 
     holder.name.setText(name1); 


     return row; 
    } 

    static class WeatherHolder 
    { 

     TextView name; 
     ImageButton b; 
    } 
} 
+1

嘗試移動'holder.b.setTag(holder);'在else部分下面。你的問題是因爲lsitview回收視圖。 – Raghunandan

+0

您是否得到了解決方案。由於 – Vinay

回答

0
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     convertView = inflater.inflate(layoutResourceId, parent, false); 

    } 
    TextView name = (TextView)convertView.findViewById(R.id.item_cours_name); 
    ImageButton b=(ImageButton) convertView.findViewById(R.id.button); 
    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      b.setImageResource(R.drawable.butgreen); 
     } 
    }); 
    String name1 = data.get(position); 
    name.setText(name1); 
    return convertView; 
} 
+0

沒有工作,我按照您的要求做了,但仍然遇到同樣的問題 –

+0

只需將getView方法替換爲我編輯的方法即可。嘗試一次 – user543

+0

我複製/粘貼了你的getview,它不工作,同樣的問題,當我點擊一個按鈕時,另一行中的另一個按鈕也被改變了 –

0

一些變化做哪些檢查出代碼

包com.example.dontpanic;

public class Coursadapter extends ArrayAdapter<String> { 

    Context context; 
    int layoutResourceId; 
    ArrayList<String> data = null; 
    WeatherHolder holder; 

    public Coursadapter(Context context, int layoutResourceId, 
      ArrayList<String> data) { 
     // super(context, layoutResourceId, data, coeff); 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 

    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new WeatherHolder(); 
      holder.name = (TextView) row.findViewById(R.id.item_cours_name); 
      holder.b = (ImageButton) row.findViewById(R.id.button); 
      holder.b.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        WeatherHolder w = (WeatherHolder) v.getTag(); 
        w.b.setImageResource(R.drawable.butgreen); 
       } 
      }); 
      row.setTag(holder); 

     } else { 
      holder = (WeatherHolder) row.getTag(); 
     } 

     holder.b.setTag(holder); 
     String name1 = data.get(position); 
     holder.name.setText(name1); 

     return row; 
    } 

    static class WeatherHolder { 

     TextView name; 
     ImageButton b; 
    } 
} 

把你的點擊監聽器裏,如果條件以及其他是否條件

+0

對不起,我更新了我的getview,我仍然有完全相同的問題! –

+0

嘗試調試您的點擊事件並檢查您的獲得情況。這可以是不同的東西 –

+0

一切似乎很好,當我調試,只有一個點擊事件,當我點擊按鈕,但不知何故另一個按鈕也改變 –

0

之外設置標籤有一個共同的誤解你的問題,兩個答案份額。

首先,確保您瞭解ListView的回收工作方式。例如,this post稍微解釋了這個問題。

關於這個特殊情況,我們先來了解一下這個問題。當你點擊一個按鈕時,圖像被改變,一切看起來都很好。但是如果你滾動,你會在另一個位置得到相同的視圖(帶有更改圖像的按鈕)。由於回收。

要解決這個問題,你必須保持你的按鈕的圖像選擇。這不會奇蹟般地發生。你必須添加一些邏輯來告訴這個方法哪個圖像資源應該顯示在一個特定的位置。

例如,在你的getView()方法,添加以下(僞)代碼:

public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    if(row == null) { 
     // omitted.. 
    } 
    else { 
     holder = (WeatherHolder)row.getTag(); 

     // BUTTON's IMAGE MAINTAINING 
     if(condition) { 
      w.b.setImageResource(R.drawable.butgreen); 
     } else { 
      w.b.setImageResource(some-other-image-resource); 
     } 
    } 

    // omitted.. 

    return row; 
} 
0

之所以出現這種情況是因爲適配器回收上滾動的意見。

例如,假設您一次總共有15行和5行適合屏幕。 if(row == null)部分僅對前5行執行。當您向下滾動到第6行時,它將使用第1行的視圖。這就是爲什麼你應該在if-else子句之後設置View的內容。所以現在,當第六行進入屏幕時,行不是null。它包含第一行的視圖。當它執行holder.name.setText(name1);時,它將用第6行的名稱替換第1行的名稱。同樣,第7行使用第2行的視圖,依此類推。

現在,假設您單擊第一行中的按鈕。第1行的視圖發生變化,w.b.setImageResource(R.drawable.butgreen);設置第1行按鈕的圖像資源。當您滾動到第6行時,它將使用第1行的視圖。但是,您只將第012行的名稱設置爲holder.name。第一行按鈕的圖像資源將保留在那裏,因此導致您的問題。

解決方案:創建另一個ArrayList<String>並在此存儲按鈕的狀態。所以在你的情況下,我假設按鈕的顏色是「紅色」或「綠色」。您可以在每個位置存儲「紅色」或「綠色」,表示每個按鈕當前的顏色(您可以將此ArrayList初始化爲紅色)。然後,當每行加載時,您可以設置圖像資源以及該行的名稱。看看下面的代碼。我已經對我添加的內容發表了評論。

public class Coursadapter extends ArrayAdapter<String> { 

Context context; 
int layoutResourceId; 
ArrayList<String> data = null; 
WeatherHolder holder; 
ArrayList<String> colors; // Stores the color of each button 

public Coursadapter(Context context, int layoutResourceId, ArrayList<String> data) { 
    // super(context, layoutResourceId, data, coeff); 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
    this.colors = new ArrayList<>(Collections.nCopies(data.size(), "red")); // initialize all the buttons to red color 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 


    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new WeatherHolder(); 
     holder.name = (TextView)row.findViewById(R.id.item_cours_name); 
     holder.b=(ImageButton) row.findViewById(R.id.button); 
     holder.b.setTag(holder); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (WeatherHolder)row.getTag(); 
    } 

    if(colors.get(position).equals("red")) { 
     holder.b.setImageResource(R.drawable.butred); // set the colors of the button to red or whatever you need 
    } else { 
     holder.b.setImageResource(R.drawable.butgreen); // set the colors of the button to green 
    } 

    holder.b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      WeatherHolder w = (WeatherHolder) v.getTag(); 
      //w.b.setImageResource(R.drawable.butgreen); 
      colors.set(position, "green"); // update the ArrayList colors 
     } 
    }); 
    String name1 = data.get(position); 
    holder.name.setText(name1); 


    return row; 
} 

static class WeatherHolder 
{ 

    TextView name; 
    ImageButton b; 
} 
} 
相關問題