Проверка отмеченного элемента в виде списка - PullRequest
0 голосов
/ 18 октября 2011

Привет, я пытаюсь реализовать длинный список, в котором пользователь может проверить элементы в представлении списка. Когда он прокручивает элемент списка, я сохраняю отмеченные элементы в массиве sparseboolean, но при попытке проверить элементы при нажатии кнопкито какие пункты проверяется.он показывает странное поведение. Когда я проверяю первый элемент и нажимаю кнопку, он дает правильный результат, но когда я начинаю проверять элементы в нижней части списка.затем он показывает странное поведение. Есть 14 элементов, проиндексированных с 0-13. Когда я проверяю 13-й элемент, он не показывает тост. Когда я щелкаю 12-й элемент, он не показывает тост. Когда я нажимаю 12-й элемент, он не показывает тостЯ нажимаю на 8-й элемент. Пожалуйста, помогите мне выяснить, в чем я ошибаюсь, и помогите мне исправить ошибку. Когда я нажимаю на 7-й элемент, выпадет три тоста 7,8,9, когда я нажимаю на 6-й элемент 5, чтобы возникли 6,7,8,9,10. Пожалуйста, помогите мне исправить эту ошибку. Я хочу показать количество выбранных тостов.вот мой код

/** 
 * 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 ]

2 голосов
/ 18 октября 2011

Что делает этот метод?

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

Есть ли в строках вашего списка кнопка?

РЕДАКТИРОВАТЬ: На самом деле - см. этот вопрос, как я думаю, это поможет.

0 голосов
/ 19 октября 2011

Только что попытался ответить на похожий вопрос Здесь .

Во-вторых, это странное поведение связано с тем, что ListView повторно использует представление sp, вам необходимо поддерживать состояние флажка и использовать это состояние в getView вашего адаптера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...