检查列表视图中的选中项目

时间:2011-10-18 14:51:28

标签: android android-layout android-widget

您好我正在尝试实现一个长列表,用户可以在列表视图中检查项目。当他滚动列表项时,我将检查的项目存储在sparseboolean数组中,但是当我尝试检查单击按钮上的项目时检查哪些项目。它显示了奇怪的行为。当我检查第一项并单击按钮然后它给出了正确的结果但是当我开始检查列表底部的项目时。然后它显示出奇怪的行为。从0-13开始索引了14个项目。当我检查第13个元素时它没有显示吐司。当我点击第12个元素时它没有显示吐司。当我点击第12个元素时它显示没有吐司第一个吐司出现时我点击第8个元素。请帮我弄清楚我错在哪里并帮我修复bug。当我点击第7个元素三个吐司来7,8,9当我点击第6个元素5toast出现6,7, 8,9,10.请帮助我修复这个bug.i想要显示选中的吐司中的数字。 这是我的代码

/** 
 * This example shows how to create a list of checkboxes. 
 */ 
public class CheckboxActivity extends ListActivity implements 
AdapterView.OnItemClickListener { 
    static SparseBooleanArray mCheckStates; 
    private CheckBoxAdapter mCheckBoxAdapter;
    List<Boolean> check;
    Button btn;
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mCheckBoxAdapter = new CheckBoxAdapter(this, 
R.layout.list_item_checkbox, GENRES); 
        setListAdapter(mCheckBoxAdapter); 
        check=new ArrayList<Boolean>();
        final ListView listView = getListView(); 
        listView.setItemsCanFocus(false); 
        listView.setTextFilterEnabled(true); 
        listView.setOnItemClickListener(this);
        btn=(Button)findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                for(int i=0;i<mCheckStates.size()+1;i++)
                    if(mCheckStates.get(i)==true)
                        Toast.makeText(CheckboxActivity.this,i+" " ,Toast.LENGTH_SHORT).show();
            }

        });
    } 
    public void onItemClick(AdapterView parent, View view, int 
position, long id) { 
        mCheckBoxAdapter.toggle(position); 
    } 
    private static class CheckBoxAdapter extends ArrayAdapter<String> 
            implements CompoundButton.OnCheckedChangeListener { 

        public CheckBoxAdapter(Context context, int resource, String[] 
objects) { 
            super(context, resource, objects); 
            mCheckStates = new SparseBooleanArray(objects.length); 
        } 
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
            final CheckBox view = (CheckBox) super.getView(position, 
convertView, parent); 
            view.setTag(position); 
            view.setChecked(mCheckStates.get(position, false)); 
            view.setOnCheckedChangeListener(this); 
            return view; 
        } 
        public boolean isChecked(int position) { 
            return mCheckStates.get(position, false); 
        } 
        public void setChecked(int position, boolean isChecked) { 
            mCheckStates.put(position, isChecked); 
            notifyDataSetChanged(); 
        } 
        public void toggle(int position) { 
            setChecked(position, !isChecked(position)); 
        } 
        public void onCheckedChanged(CompoundButton buttonView, 
boolean isChecked) { 
            mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
        } 
    } 
    private static final String[] GENRES = new String[] { 
        "Action", "Adventure", "Animation", "Children", "Comedy", 
"Documentary", "Drama", 
        "Foreign", "History", "Independent", "Romance", "Sci-Fi", 
"Television", "Thriller" 
    }; 
} 

2 个答案:

答案 0 :(得分:2)

这种方法在做什么?

public void onCheckedChanged(CompoundButton buttonView, 
                            boolean isChecked) { 
    mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
}

列表行中是否有一个按钮?

编辑:实际上 - 请参阅this问题,因为我认为它会有所帮助。

答案 1 :(得分:0)

试着回答类似的问题Here

其次,这种奇怪的行为是因为ListView重用了视图,你必须维护复选框的状态,并在你的适配器的getView中使用该状态。