[英]Android Studio - Listview OnClick Activates Multiple Checkboxes
[英]ListView with checkboxes android studio
當在我的 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);
我想了一個方法來解決這個問題,我在 setOnCheckedListener 中為復選框調用了 toggleChecked(),復選框以這種方式工作,但是我的 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);
}
});
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.