Выполните итерацию через ListView в Android, чтобы сделать флажки видимыми перед каждым элементом

#android #android-layout #android-listview

#Android #android-layout #android-listview

Вопрос:

Для начала я использовал обучающий код Android notepad. В моем notes_row.xml у меня есть textview для отображения заголовка заметки и флажка, который изначально скрыт Android: видимость = «исчезла»

Я хочу, чтобы, когда пользователь открывает меню опций и нажимает «Отметить», флажки перед каждым элементом в списке должны стать видимыми. Однако, когда я нажимаю на пометку в эмуляторе, становится видимым флажок только для первой заметки. Итак, я хочу выполнить итерацию по всему списку и установить видимость (0), чтобы все флажки были видны. Я новичок, поэтому, пожалуйста, ответьте подробно. Заранее спасибо.

Мой фрагмент кода:

 public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
    case INSERT_ID:
        createNote();
        return true;
    case MARK_ID:
                // only first item check box appears with following 2 lines:
                    CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
                    checkBox.setVisibility(0);

                /* tried the following, but no chekbox appears with this:   
        Cursor c = mDbHelper.fetchAllNotes();
        c.moveToPosition(0);
        while(c.isAfterLast()){
            CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
            checkBox.setVisibility(0);
            c.moveToNext();
        }
                 */
        return true;
}
  

В моем новом коде после прочтения ответов по-прежнему отображается только флажок первого элемента:

 public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
    case INSERT_ID:
        createNote();
        return true;
    case MARK_ID:
        CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
        String[] lvItems = new String[]{NotesDbAdapter.KEY_TITLE};
        MyAdapter arrAdapter = new MyAdapter(this, android.R.layout.simple_list_item_multiple_choice, lvItems);
        arrAdapter.toggleCheckBoxVisibility(checkBox);
        arrAdapter.notifyDataSetChanged();
                    return true;
    return super.onMenuItemSelected(featureId, item);
             }
  

Вот мой адаптер:

 private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int textViewResourceId,
            String[] objects) {
        super(context, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.notes_row, parent, false);
        //String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
        return row;
        //return super.getView(position, convertView, parent);
    }

    public boolean toggleCheckBoxVisibility(CheckBox checkBox){
        checkBox.setVisibility(0);
        super.notifyDataSetChanged();
        return true;
    }

}
  

Комментарии:

1. на какой адаптер вы подаете в суд за отображение отдельного элемента в списке

2. я использую: Cursor notesCursor = mDbHelper.fetchAllNotes(); startManagingCursor(notesCursor); // Создаем массив для указания полей, которые мы хотим отобразить в списке (только ЗАГОЛОВОК) String[] from = new String[]{notesdabadapter. KEY_TITLE}; // и массив полей, к которым мы хотим привязать эти поля (в данном случае просто text1) int[] to = new int[]{R.id.textView1}; // Теперь создайте простой адаптер курсора и настройте его на отображение SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to); setListAdapter( примечания); }

Ответ №1:

В вашем адаптере создайте метод для установки логического флага для видимости. При нажатии кнопки вызовите метод и установите флаг в true. Затем используйте notifyDataSetChanged() для обновления вашего списка. Затем в вашем методе getView вы можете установить видимость вашего флажка на значение, указанное в логическом флаге.

Комментарии:

1. Я сделал это, но по-прежнему отображается только флажок первого элемента. Пожалуйста, ознакомьтесь с изменениями в вопросе. Я могу отправить вам полный проект по электронной почте, если хотите. Спасибо.

2. Вы неправильно поняли мой подход — метод в адаптере должен быть: public void toggleCheckBoxVisibility(логическая видимость){ checkboxVisibility = видимость; notifyDataSetChanged(); } Затем в вашем getView вы используете: CheckBox флажок = (CheckBox) row.findViewById(R.id.checkBox1); checkBox.setVisibility(checkboxVisibility? Вид. ВИДИМЫЙ: View.GONE);

Ответ №2:

  1. Возьмите свой адаптер списка
  2. Выполните итерацию по представлениям элементов списка с помощью getView (или аналогичного)
  3. Для каждого извлекаемого представления выполните v.setVisibility (Просмотр.ВИДИМЫЙ)

Это примерно то, что вам нужно сделать, чтобы взаимодействовать с каждым представлением вашего списка

РЕДАКТИРОВАТЬ: более конкретно: внутри основного потока вашей активности

 MyAdapter a= (MyAdapter) this.getArrayAdapter(); 
//count how many views you have to iterate and build a for loop accordingly
for(...){
    View v = a.getView(/*based on the for index position */).setVisibility(View.VISIBLE) 
//Do something else with the view if you want...
  

Это решение предполагает, что вы уже создали и связали с вашей деятельностью адаптер массива.

Комментарии:

1. Пожалуйста, уточните шаг 2!! вот в чем мой вопрос! Спасибо.

2. например, внутри основного потока вашей активности: MyAdapter a= (MyAdapter) this.getArrayAdapter(); //подсчитайте, сколько просмотров вам нужно выполнить итерацию, и создайте цикл for соответственно View v = a.getView(/*на основе позиции индекса for */).setVisibility(Просмотр. ВИДИМЫЙ) // Сделайте что-нибудь еще с представлением, если хотите…

Ответ №3:

Попробуйте это: В вашем классе напишите этот код:

 @Override
protected void onStart() {
    super.onStart();

    ArrayAdapter<String> araAdapter=new ArrayAdapter<String>(getApplicationContext(),             

    android.R.layout.simple_list_item_multiple_choice, xmlList);
    listView_xml.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    listView_xml.setAdapter(araAdapter);
}
  

XMLList — это то, что вы сохраняете в данных, или ваш массив string[]. listview_xml — это имя вашего listview.
Ознакомьтесь с этим руководством по реализации нескольких флажков