2013-11-15 12 views
0

我有一個ArrayAdapter類創建評論框。評論框內有一個按鈕,可以是藍色或黑色。按鈕的顏色取決於通過JSON接收的數組。如果數組看起來像這樣"NO","NO","YES","NO","NO","NO"第三個按鈕將會有藍色文本。我的JSON和ArrayAdapter類一次創建7個評論框。問題是一旦代碼將按鈕更改爲藍色,它會不斷將按鈕更改爲藍色。通過這個我的意思是,如果一個數組收到,看起來像這樣"NO","NO","YES","NO","NO","NO"第三個按鈕將是藍色,然後我收到另一組評論,所以這次這個數組看起來像這樣"NO","NO","NO","NO","NO","NO"根據這個代碼沒有按鈕應該是藍色的,但對於一些原因第三個按鈕仍然是藍色的。我可以加載多個註釋集,第三個按鈕將始終爲藍色,即使代碼清楚地表明它應該是黑色的。奇怪的是,按鈕將是藍色的,但會像黑色按鈕一樣。這是我的ArrayAdapter,ArrayAdapter有奇怪的結果 - Android

class ListAdapter extends ArrayAdapter<Item> { 
     public ListAdapter(Context context, int textViewResourceId) { 
      super(context, textViewResourceId); 
     } 

     private List<Item> items; 

     public ListAdapter(Context context, int resource, List<Item> items) { 
      super(context, resource, items); 
      this.items = items; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 
      if (v == null) { 
       LayoutInflater vi; 
       vi = LayoutInflater.from(getContext()); 
       v = vi.inflate(R.layout.list_item_layout, null); 
      } 
      final Item p = items.get(position); 
      if (p != null) { 
       //set xml objects 
       //must be done inside of class 
       ButtonListViewItem = (TextView) v.findViewById(R.id.button_listview_item); 
       if(p.getJSONArray().equals("NO")){ 
       ButtonListViewItem.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         ButtonListViewItem.setTextColor(0xff000000); 
         new AsyncTask().execute(); 
        }//end on click 
       }); 
       }//end if equals NO 
       if(p.getJSONArray().equals("YES")){ 
        ButtonListViewItem.setClickable(false); 
        ButtonListViewItem.setTextColor(0xff3399FF); 
       }//end if equals yes 
      }//end if null 
      return v; 
     }//end getView 
     }//end ListAdapter class 
+0

將你的代碼發佈到你正在設置數組和列表視圖的地方。 –

+0

調用你的適配器「'ListAdapter'」聽起來像是一個保證與[Android的'ListAdapter'類]混淆的祕訣(http://developer.android.com/reference/android/widget/ListAdapter.html)('ArrayAdapter '延伸)。 – blahdiblah

+0

只要它在不同的包中,我看到使用名稱ListAdapter沒有問題 – EJK

回答

1

由於您沒有正確處理回收視圖,文字顏色錯誤。

最短和最簡單的解決方法是刪除此檢查:

if (v == null) 

每一次膨脹的新觀點。這效率較低,但會使代碼更易於使用。

的解決方案,如果你選擇繼續使用回收的觀點是明確設置按鈕的文字顏色和可點擊每次:

if (p.getJSONArray().equals("YES")) { 
    ButtonListViewItem.setClickable(false); 
    ButtonListViewItem.setTextColor(0xff3399FF); 
} else { 
    ButtonListViewItem.setClickable(true); 
    ButtonListViewItem.setTextColor(0xff000000); 
} 

你需要做的原因是因爲回收的意見移交就像你離開他們一樣,改變了屬性和所有。它們將不再符合您的XML佈局。因此,當以前與「是」相關聯的視圖被回收時,您對文本顏色所做的更改仍然存在:文本將變爲藍色,並且該按鈕將不可點擊。

充氣一個新視圖允許你在一個已知的狀態,每次啓動---你總是有東西,開始了符合XML。折衷是效率,膨脹的觀點是相對昂貴的。如果您的應用程序需要更高效,那麼您應該查看the view holder模式,因爲查找視圖也是可以避免的費用。

+0

我用你的第一個方法,它似乎工作。謝謝您的幫助! – user2861085