2010-08-12 45 views
10

Chỉnh sửa: OK, tôi đã tìm được giải pháp. Không biết rằng đó là giải pháp thích hợp, nhưng nó hoạt động chính xác. Đã thêm vào mã bên dưới.Trả về giá trị từ nhiều lựa chọn ListView

Tôi đang cố gắng cho phép người dùng chọn một số thư mục từ danh sách kiểm tra và trả lại chúng khi nhấp vào nút "Gửi". Đây là một đoạn mã của tôi. Nó populates ListView với tất cả các thư mục trên/sdcard /, và cho việc lựa chọn ban đầu (tuy nhiên nhiều tôi chọn) khi tôi gửi, nhật ký cho thấy các lựa chọn đúng được trả về. Tuy nhiên, nếu tôi bỏ chọn một mục và nhấp lại vào "Gửi", nó vẫn hiển thị như thể tất cả được chọn. Tôi có cần phải viết một trình xử lý để bỏ chọn một mục không? Tôi nghĩ rằng đã được chăm sóc bởi sự lựa chọn choiceMode? Cảm ơn!

private SparseBooleanArray a;  
directoryList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, directoryArray)); 
    submitButton = (Button)findViewById(R.id.submit_button); 
    submitButton.setOnClickListener(new OnClickListener() 
     { 
     @Override 
     public void onClick(View v) 
     { 
      a = new SparseBooleanArray(); 
      a.clear(); 
      a = directoryList.getCheckedItemPositions(); 

      for (int i = 0; i < a.size(); i++) 
      { 
       //added if statement to check for true. The SparseBooleanArray 
       //seems to maintain the keys for the checked items, but it sets 
       //the value to false. Adding a boolean check returns the correct result.      
       if(a.valueAt(i) == true) 
        Log.v("Returned ", directoryArray[a.keyAt(i)]); 

      }     
     } 
    }); 

Trả lời

3

Đã thực hiện một số sửa lỗi và tìm ra giải pháp phù hợp với tôi. Đã chỉnh sửa thành mã ở trên. Đối với một số lý do, SparseBooleanArray không tự rỗng; nó duy trì các phím của các hộp đã được kiểm tra. Tuy nhiên, khi getCheckedItemPositions() được gọi, nó đặt giá trị VALUE thành false. Vì vậy, khóa vẫn nằm trong mảng được trả về, nhưng nó có giá trị false. Chỉ các hộp được chọn sẽ được đánh dấu bằng giá trị đúng.

1

không có nghĩa là làm điều này như là một câu trả lời nhưng tôi đã phải mở rộng trên những gì bạn đã làm để làm đa lựa chọn. Tại sao bạn làm biến trường cho các lựa chọn của mình? tôi chỉ làm SparseBooleanArray địa phương ...

public class NaughtyAndNice extends ListActivity { 
TextView selection; 
String[] items={"lorem","ipsum", "dolor", "sit", "amet", 
     "consectetuer", "adipisc", "jklfe", "morbi", "vel", 
     "ligula", "vitae", "carcu", "aliequet"}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,items)); 
      selection = (TextView)findViewById(R.id.selection); 
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
} 

public void onListItemClick(ListView parent, View view, int position, long id){ 
    SparseBooleanArray choices = parent.getCheckedItemPositions(); 
    StringBuilder choicesString = new StringBuilder(); 
    for (int i = 0; i < choices.size(); i++) 
    { 
    //added if statement to check for true. The SparseBooleanArray 
    //seems to maintain the keys for the checked items, but it sets 
    //the value to false. Adding a boolean check returns the correct result.      
     if(choices.valueAt(i) == true) 
      choicesString.append(items[choices.keyAt(i)]).append(" "); 

    } 
    selection.setText(choicesString); 
} 
} 

+0

có vẻ như không hiệu quả khủng khiếp để thực hiện vòng lặp và sau đó bên trong vòng lặp for thực hiện một keyAt ... keyAt xấu như thế nào? oh well – JDPeckham

+0

Tôi không hiểu sự khác biệt trong mã này ... nó có vẻ giống như chức năng của tôi. – kcoppock

+0

Oh nevermind, tôi đã bỏ lỡ câu hỏi của bạn. Không có lý do thực sự nào để thực hiện biến lớp cho SBA, tôi chỉ mới sử dụng Java và Android và đã làm điều đó một cách ngu ngốc. :) – kcoppock

4

Tôi biết bạn đã tìm thấy một giải pháp phù hợp với mình, nhưng sạch và giải pháp đơn giản mà có lẽ sẽ làm việc hầu hết các thời gian là điều này (Tôi muốn duy trì tất cả các id của các yếu tố được chọn):

(trong ListActivity của tôi):

SparseBooleanArray selectedPos = getListView() 
     .getCheckedItemPositions(); 

ListAdapter lAdapter = getListAdapter(); 
List<Long> ids = new LinkedList<Long>(); 
    for (int i = 0; i < lAdapter.getCount(); i++) { 
    if (selectedPos.get(i)) { 
     ids.add(lAdapter.getItemId(i)); 
    } 
} 
1

Không cần phải sử dụng SparseBooleanArray choices = parent.getCheckedItemPositions();

StringBuilder là đủ cho việc này.

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