2013-02-20 157 views
2

我有一個ListView,其中包含複選框,其行爲有時像CHOICE_MODE_MULTIPLE,有時像CHOICE_MODE_SINGLE。我的意思是列表中的某些項目,當選擇某些其他項目需要取消選擇,而其他項目可以保持選擇。如何在單擊某個項目時更改Android ListView中的其他項目

所以當項目一個被選中,我可以在我的數據需要被選中,但我怎麼拿到UI刷新,以顯示這是我(我相信)無法找到實際的項目找到View,代表B但只是它的數據?

+0

我想通了,我可以用'getChildAt'和'getFirstVisiblePosition'找到實際的'View'我需要考慮的項目指標和減去'getFirstVisiblePosition返回的值更新'。 – bornander 2013-02-20 22:37:43

回答

0

可以使用singleChoice alartDialog,我已經使用,如:

private int i = 0; // this is global 
private final CharSequence[] items = {"Breakfast", "Lunch", "Dinner"}; // this is global 

Button settings = (Button)view.findViewById(R.id.settings); 

settings.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(final View v) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); 

    //Title of Popup 
    builder.setTitle("Settings"); 

    builder.setSingleChoiceItems(items, i, 
      new DialogInterface.OnClickListener() { 
     // When you click the radio button 
     public void onClick(DialogInterface dialog, int item){ 

      i=item; 
     } 
    }); 

    builder.setPositiveButton("Confirm", 
      new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int item) { 

      if (i == 0) { 
        //it means 1st item is checked, so do your code 
      } 
      if (i == 1) { 
      //it means 2nd item is checked, so do your code 
      } /// for more item do if statement  
     } 
    }); 
     //When you click Cancel, Leaves PopUp. 
     builder.setNegativeButton("Cancel", null); 
     builder.create().show(); 

    } 
}); 

因此,對於第一次上settings按鈕用戶點擊,選擇的第一個項目時,我已經初始化i=0。然後當用戶選擇其他項目後,我保存了i值,以便下次用戶點擊settings按鈕時,我可以向用戶顯示他/她先前選擇的項目。

0

這聽起來像你是一個好開始。當你點擊A時,你應該操縱項目B的底層數據源。

兩個小技巧,可以幫助你:

  1. getView()在適配器方法應該是看你的數據源,並根據其發現改變convertView。您無法找到代表B的實際視圖,因爲在ListView中,Views將被回收並在需要顯示不同的數據時重新使用。基本上,當一個項目從列表中滾動時,已使用的View作爲convertView傳遞到getView()函數,準備處理下一個元素的數據。出於這個原因,您可能不應直接根據用戶輸入而改變View中的ListView,而應根據底層數據直接更改View
  2. 您可以在您的適配器中調用notifyDataSetChanged()來發出信號,指出底層數據已更改的某個位置,並且應該再次調用getView()以顯示列表中當前顯示的元素。

如果您仍然遇到問題,請隨時發佈一些代碼,說明您遇到的具體問題。當問題得到更好的定義時,提供具體的建議會容易得多。希望這可以幫助!

0

我今天碰到並解決了這個問題。

public class ItemChooceActivity extends Activity implements OnItemClickListener { 

     private int chosenOne = -1; 

     class Madapter extends BaseAdapter { 
       ..... 
       ..... 
     @Override 
     public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 

      if (chosenOne != position) { 
       set the view in A style 
      } else { 
       set the view in B style 
      } 

     return convertView; 
    } 
} 



     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, 
     long arg3) { 
    ,,,, 
     chosenOne = position; 
     adapter.notifyDataSetChanged(); 
     ,,, 
} 

}

相關問題