2012-07-11 36 views
6

Tôi đang làm việc trên một ứng dụng mẫu để tìm hiểu android. Nó được cho là để hiển thị một danh sách chọn nhiều và khi người dùng nhấp vào nút nó sẽ hiển thị các mục được chọn trong một TextView ở đầu trang. Có vẻ như khi tôi cố gắng lấy các mục đã chọn từ ListView, một mảng trống luôn được trả về. Bất cứ ai có thể giải thích cho tôi tại sao đây là trường hợp và những gì tôi đang thiếu để làm cho nó hoạt động chính xác? (FYI mã là một chương trình sửa đổi từ Beginning Android 4 bởi Grant Allen)Mảng trống khi sử dụng getListView(). GetCheckedItemIds()

Dưới đây là file layout xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <TextView 
     android:id="@+id/selection" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
    <Button 
     android:id="@+id/getSelections" 
     android:text="Show Selections" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="listSelected" /> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:drawSelectorOnTop="false" 
     android:choiceMode="multipleChoice" /> 
</LinearLayout> 

Và đây là Java liên quan:

package com.commonsware.android.checklist; 

import android.os.Bundle; 
import android.app.ListActivity; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.view.*; 

public class ChecklistDemo extends ListActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
        "sit", "amet", 
        "consectetuer", "adipiscing", "elit", "morbi", "vel", 
        "ligula", "vitae", "arcu", "aliquet", "mollis", 
        "etiam", "vel", "erat", "placerat", "ante", 
        "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    private TextView selection; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     setListAdapter(new ArrayAdapter<String>(this, 
               android.R.layout.simple_list_item_multiple_choice, 
               items)); 
     selection = (TextView)findViewById(R.id.selection); 

    } 

    public void listSelected(View view) { 
     long[] chosenOnes = getListView().getCheckedItemIds(); 
     selection.setText("Items selected: "); 
     selection.setText(Integer.toString(chosenOnes.length)); 
     for (long x:chosenOnes) { 
      int i = Long.valueOf(x).intValue(); 
      selection.setText(selection.getText() + ", " + items[i]);   
     } 

    } 

} 

Trả lời

12

Xem doc, phương thức getCheckedItemIds() trả lại kết quả hợp lệ chỉ khi bộ điều hợp của bạn có id ổn định. Thay vào đó bạn có thể sử dụng

SparseBooleanArray array = this.getListView().getCheckedItemPositions();

Hy vọng điều này sẽ giúp bạn =)

+0

Awesome, nhờ một bó cho điều đó. Theo dõi, tôi có thể yêu cầu làm rõ một số điều chính xác làm cho id ổn định không? –

+0

Vâng tôi cũng muốn biết. Tôi đoán nó có nghĩa là mỗi id luôn tương ứng với cùng một đối tượng, nhưng tài liệu không rõ ràng. – Timmmm

+3

bạn có thể ghi đè phương thức hasStableIds() trong BaseAdapter chẳng hạn, và để cho nó trả về true nếu getId() của bạn được triển khai đúng cách. – Ostkontentitan

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