Просмотр списка с флажками Android studio

#android #listview #checkbox

#Android #просмотр списка #флажок

Вопрос:

У меня возникли проблемы с установкой флажков, когда какая-либо из функций (которые сейчас закомментированы) вызывается внутри моего ListView onItemClickedListener. toggleChecked должен обновлять только мою базу данных, а RefreshList должен обновлять мой ListView. Мой OnItemClickListener

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                ListItemDetails listItemDetails = (ListItemDetails) arrayAdapter.getItem(i);

                //toggleChecked(i, view);

                //RefreshList(arrayAdapter);
                CheckBox checkBox = (CheckBox)view.findViewById(R.id.listitems_checkbox);
                checkBox.setChecked(!checkBox.isChecked());
            }
        });
  

Проверенная функция

 public void toggleChecked(final Integer i,final View view)
    {
        final DatabaseReference RootRef;
        RootRef = FirebaseDatabase.getInstance().getReference();

        RootRef.child("Lists").child(ListDetails.getID()).child("listitems").child(arrayList.get(i).getID()).child("checked").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String checked = snapshot.getValue(String.class);
                Map<String, Object> map = new HashMap<>();
                map.put("checked",(checked.equals("0") ? "1" : "0"));

                RootRef.child("Lists").child(ListDetails.getID()).child("listitems").child(arrayList.get(i).getID()).updateChildren(map);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }
  

Функция обновления списка

 public void RefreshList(final ArrayAdapter<ListItemDetails> arrayAdapter) {
        DatabaseReference reference;
        reference=FirebaseDatabase.getInstance().getReference().child("Lists");
        reference.child(ListDetails.getID()).child("listitems").orderByChild("name").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                arrayList.clear();
                for(DataSnapshot ds : snapshot.getChildren())
                {
                    ListItemDetails temp = new ListItemDetails();
                    String name = ds.child("name").getValue(String.class);
                    temp.setName(name);
                    String ID = ds.child("ID").getValue(String.class);
                    temp.setID(ID);
                    String checked = ds.child("checked").getValue(String.class);
                    temp.setChecked(checked);
                    arrayList.add(temp);
                }
                listView.setAdapter(arrayAdapter);

                for(int i=0; i<listView.getAdapter().getCount(); i  )
                {
                    View v = getViewByPosition(i,listView);
                    CheckBox checkBox = (CheckBox)v.findViewById(R.id.listitems_checkbox);
                    if(arrayList.get(i).getChecked().equals("1"))
                    {
                        checkBox.setChecked(true);
                    }
                    else {
                        checkBox.setChecked(false);
                    }
                }
            }


            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }
  

XML для адаптера

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="35sp"
        android:id="@ id/textt">
    </TextView>
    <CheckBox
        android:id="@ id/listitems_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="35dp"
        android:layout_alignParentEnd="true"
        android:clickable="false"
        />
</RelativeLayout>
  

Адаптер объявляется следующим образом

 final ArrayAdapter arrayAdapter = new ArrayAdapter<ListItemDetails>(this, R.layout.list_items_checkbox, R.id.textt, arrayList);
  

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

1. Флажок будет установлен / снят, когда пользователь нажимает на него. Почему вы устанавливаете отмеченное значение при срабатывании onItemClicked? Для меня это не имеет смысла.

2. Я проверяю это на onItemClicked, потому что флажок не доступен для просмотра, но он не работает, если я проверю его на onItemClicked

Ответ №1:

Я нашел способ обойти это, я вызываю toggleChecked() внутри setOnCheckedListener для флажка, флажки работают таким образом, но мой setOnCheckedListener не работает должным образом, он достигает toggleChecked() только всякий раз, когда я снимаю определенный флажок.

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            ListItemDetails listItemDetails = (ListItemDetails) arrayAdapter.getItem(i);
            final Integer newi = i;

            CheckBox checkBox = (CheckBox) view.findViewById(R.id.listitem_checkbox);
            checkBox.setChecked(!checkBox.isChecked());

            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    toggleChecked(newi);
                }
            });
        }
    });
  

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

1. Вы устанавливаете oncheckedchangelistener только тогда, когда пользователь нажимает на элемент. И только на флажке этого элемента. Вы, конечно, должны установить все флажки во всех элементах такого прослушивателя. И без необходимости пользователю сначала нажимать на элемент. Для этого вам следует расширить класс arrayadapter и предоставить каждому флажку такой прослушиватель в getView().

2. Спасибо за ваш ответ, я подумал, что могу просто отобразить текст из базы данных, чтобы указать, что listitem «готово», в любом случае спасибо за ваше время! Хорошего дня