2014-01-25 28 views
0

我試圖鎖定按鈕後用戶單擊服裝列表上的按鈕。 從hayoola取得的名單的項目,然後我用查看者顯示數據 列表中的用戶。 如果用戶點擊接受或拒絕按鈕。結果將傳遞到hayoola和 選定的按鈕將被禁用 問題是用戶單擊按鈕後錯誤的按鈕獲取禁用。並且在五次點擊之後剩下的所有按鈕也被禁用。錯誤的項目返回查看持有人onclick事件

這裏是我的適配器代碼:

static class myviewholder { 
    TextView textfromhayoola; 
    ImageButton buttonaccpet; 
    ImageButton buttonrefuse; 

} 
public View getView(int position, View convertView, ViewGroup parent) { 
try { 
    final myviewholder viewHolder; 
    final int itemlocation = position; 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.listforuser, null); 
      viewHolder = new myviewholder(); 
      viewHolder.textfromhayoola = (TextView) convertView.findViewById(R.id.textfromhayoola); 
      viewHolder.buttonaccpet= (ImageButton) convertView.findViewById(R.id.buttonaccpet); 
      viewHolder.buttonrefuse= (ImageButton) convertView.findViewById(R.id.buttonrefuse); 
      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (myviewholder) convertView.getTag(); 
     } 
     HashMap<String, String> myhayooladata= new HashMap<String, String>(); 
     myhayooladata = data.get(position); 
     if (myhayooladata != null) { 
       viewHolder.textfromhayoola.setTag(myhayooladata.get("id_textfromhayoola")); 
      viewHolder.textfromhayoola.setText(myhayooladata.get("textfromhayoola")); 
      viewHolder.buttonaccpet.setTag(getItemId(position)); 
      viewHolder.buttonrefuse.setTag(getItemId(position)); 

     viewHolder.buttonaccpet.setOnClickListener(new OnClickListener() { 

      public void onClick(View arg0) { 

       performOnBackgroundThread(new Runnable() { 
        public void run() { 

          passdatatohayoola(viewHolder.textfromhayoola.getTag().toString(),"accpet"); 
        } 
       }); 
      arg0.findViewWithTag(viewHolder.buttonaccpet.getTag()).setEnabled(false); 
      arg0.findViewWithTag(viewHolder.buttonrefuse.getTag()).setEnabled(false);  
      } 
     }); 
     viewHolder.buttonrefuse.setOnClickListener(new OnClickListener() { 

      public void onClick(View arg0) { 

       performOnBackgroundThread(new Runnable() { 
        public void run() { 

          passdatatohayoola(viewHolder.textfromhayoola.getTag().toString(),"refuse"); 
        } 
       }); 
      arg0.findViewWithTag(viewHolder.buttonaccpet.getTag()).setEnabled(false); 
      arg0.findViewWithTag(viewHolder.buttonrefuse.getTag()).setEnabled(false);  
      } 
     }); 

回答

0

呵呵。你是否認爲這一點。只是「n /你的記錄數」視圖將被創建?

假設: 如果您有100條記錄,將會繪製10行。

並且10行不會重新繪製。

行1的按鈕接受被禁用,意味着行11 + n的按鈕接受是相同的。 :D

可能是你的問題。

並請閱讀本:

讓我來告訴你什麼ViewHolder模式。

當你加載數據到ListViewGridView或類似的東西。

如果您的數據有1000條記錄,... ListView不會加載1000條記錄。它只是加載「n條記錄」。 「n」是與您的屏幕設備兼容的記錄數。

實施例:N = 10。

當向下滾動,該ListView將加載更多的數據。在這種情況下,每行(行的視圖)將重新繪製。

ListView它有大量的數據,當使用向上或向下滾動時,你會看到你的應用程序將會很慢...因爲視圖正在重新繪製。

而ViewHolder是幫助你解決這個問題的模式。

當您使用ViewHolder模式時,只會創建「n」(在本例中爲n = 10)視圖。

所以,在你的問題。我可以告訴你:

可能是你實施的ViewHolder是不正確的。

好的。讓我告訴你關於解決方案。

if (convertView == null) { 
    //You just findView and set for view 
    // viewHolder = new ViewHolder(); 
    // viewHolder.yourBtn = convertView.findViewById(R.id.some_view_id); 
    // convertView.setTag(viewHolder); 
} else { 
    //Right here, you will get viewHolder, because convertView is not null. It mean the viewHolder is existed. 
} 

而就在這裏,它意味着你每次都會設置數據的時間(你不會緩存數據,只查看緩存)

假設你的數據是一個對象,對象有哪些代表狀態屬性的按鈕。

MyObject { 
    boolean objStatus; 
} 

,當您爲步行通過插孔,這裏有一個問題設定數據

viewHolder.yourBtn.setEnable(instanceOfMyObject.objStatus); 
+0

感謝。在「其他」條件「convertView」應該爲空?在第一個ü檢查非空「(convertView!= null)」 –

+0

我很抱歉,這是我的錯誤。 convertView == null。這是!= – Luc

+0

對於我缺乏知識感到遺憾,但是我在使用的答案和方法有什麼不同? 加u是currect,如果我點擊一個按鈕,第二次加載的下一個n按鈕也將獲得禁用。 –