簡體   English   中英

帶有復選框的ListView android studio

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM