2012-12-19 27 views
8

Tôi đang phát triển một ứng dụng Android đơn giản mà tạo ra một ListView với một hộp kiểm như sauisChecked() hành vi hoàn toàn ngược lại trong 2.3.6 & 4.2 phiên bản android

listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,results); 
this.setListAdapter(listAdapter); 
ListView lv = getListView(); 
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

lv.setOnItemClickListener(new OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
         long id) { 
      CheckedTextView check = (CheckedTextView)view; 
      //The below code needed for running on AVD version 4.2 
      if(check.isChecked()) { 
        // Checkbox checked do something 
      } 
      else { 
        // Not checked. Do something 
      } 
      /* Exact opposite need on Samsung phone running 2.3.6 
      if(!check.isChecked()) { 
         // Checkbox checked do something 
      } 
      else { 
      // Not checked. DO something 
      } */ 

Đây là thực sự kỳ lạ. Ứng dụng sẽ tương thích như thế nào với cả hai phiên bản khi chúng yêu cầu kiểm tra hoàn toàn ngược lại?

Vui lòng cho tôi biết cách tôi có thể xử lý việc này. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Điều đó thật lạ. Bạn đã thử chạy trên 2.3.3/2.3.6 AVD? –

Trả lời

3

tôi biết sự cố, trên các khuôn khổ mới hơn, cuộc gọi onItemClick trước khi thuộc tính kiểm tra của hộp kiểm đã thay đổi!

tôi kiểm tra trạng thái đã chọn của các hộp kiểm của mình sau khi nhấp vào mục (ví dụ: khi hoạt động đóng hoặc lưu nút nhấp).

xem list.getCheckedItemPositions() ... nó sẽ trả lại SparseBooleanArray bạn có thể sử dụng!

EDIT: Ví dụ

public class MyMultiChoiceActivity extends Activity implements View.OnClickListener { 

    private ListView list = null; 
    private boolean savedSelectionInvalid = true; 
    private List<Integer> selectedIds = new ArrayList<Integer>(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.entry_data_multi_choice_filter); 

     //initialize the list 
     list = (ListView) findViewById(R.id.list); 
     listAdapter = new MyListAdapterClass(this, R.layout.list_item_multiple_choice); 
     list.setAdapter(listAdapter); 

     //onclick on a item, set the selectaion as invalid 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       savedSelectionInvalid = true; 
      } 
     }); 

     list.setAdapter(listAdapter); 

     //... 
    } 

    //... 

    private void validateChecked() { 
     if(savedSelectionInvalid == true) { 
      SparseBooleanArray checkedItemlist = list.getCheckedItemPositions(); 
      selectedIds.clear(); 
      for (int i=0; i < checkedItemlist.size(); i++){ 

       if (checkedItemlist.valueAt(i)) { 
        selectedIds.add(a.keyAt(i)); 
       } 
      } 
      this.savedSelectionInvalid = false; 
     } 
    } 

    //... 

    //this method se 
    private void saveAndClose() { 
     validateChecked(); 

     //now you have the selectedIds filled with every checked item key! 

     this.finish(); 
    } 
} 
+0

@Karthik Tôi dự định làm điều đó. Một sự khác biệt nhỏ hơn mặc dù là vị trí của nút Cancel & Ok được hoán đổi cho nhau. Điều này là vô hại mặc dù. –

+0

Thanks.Yes Tôi sử dụng SparseBooleanArray để xử lý các kiểm tra. Tuy nhiên như tôi đã đề cập, tôi phải đảo ngược kiểm tra trước khi xử lý trên AVD và điện thoại của tôi để nó hoạt động. –

+0

bạn có thể vui lòng giải thích về điều này. Tôi đã kiểm tra trên AVD 2.3.3 hành vi vẫn là đối diện với thiết bị thực. –

2

Vấn đề này có thể được giải quyết bằng cách kiểm tra phiên bản của thiết bị.

Tài liệu khuyên bạn nên kiểm tra Build.VERSION.SDK_INT so với các giá trị trong Build.VERSION_CODES.

sử dụng mẫu

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
// only for android older than gingerbread 
} 

http://developer.android.com/reference/android/os/Build.VERSION.html

(Giống như một hack hơn là một giải pháp mặc dù)

+0

cảm ơn đề xuất. Có cách nào để tìm ra phiên bản nào thay đổi hành vi này để tôi có thể thêm séc? Kiểm tra sẽ sử dụng điều kiện ngược lại cho các phiên bản lớn hơn (ví dụ: 4.x) –

+0

Một lần nữa, đây có thể là lỗi nhưng bạn chỉ có thể kiểm tra hành vi trên các bản sửa đổi hệ điều hành chính. Kiểm tra trên 2.3. Nếu không phải là nó có thể đã thay đổi trong 4.0 – cjds

+0

tôi xây dựng trên 2.3.3. Hành vi trong AVD (2.3.3) và thiết bị (2.3.6) vẫn ngược lại. Nó khiến tôi phát điên. Tôi không biết phải làm gì. –

0

Bạn cũng có thể cố gắng sử dụng một cái gì đó như thế này:

mFilterListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     ... 
     SparseBooleanArray checkedItemlist = mFilterListView.getCheckedItemPositions(); 

     boolean checked = false; 
     for (int i = 0; i < checkedItemlist.size(); i++) { 
      if (checkedItemlist.keyAt(i) == position) { 
      checked = checkedItemlist.valueAt(i); 
     } 
     ... 
    } 
} 

Như kết quả bạn có cờ được kiểm tra, cho biết trạng thái của mục sau nhấp chuột là gì.

Các vấn đề liên quan