#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 «готово», в любом случае спасибо за ваше время! Хорошего дня