ListView с флажками: Как я могу проверить, если он установлен или нет? - PullRequest
0 голосов
/ 29 апреля 2018

В моей программе у меня есть простой ListView и я установил ArrayAdapter:

arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), 
R.layout.row_layout_checkbox, R.id.textView_checkbox, list);
listView.setAdapter(arrayAdapter);

"list" - это строковый массив (String []).

Макет XML row_layout_checkbox :

<?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="60dp"
android:orientation="vertical">

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="14dp"
    android:layout_marginEnd="14dp"/>

<TextView
    android:id="@+id/textView_checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="17dp"
    android:layout_marginStart="17dp"
    android:text="TextView"
    android:textColor="@color/colorBlack"/>
</RelativeLayout>

Итак, мой вопрос : Как я могу проверить, какие флажки отмечены или нет, чтобы я мог поставить true или false в логический массив?

(Должен быть установлен флажок для каждого элемента и должен быть множественный выбор, а не один).

1 Ответ

0 голосов
/ 29 апреля 2018

Вы должны расширить свой собственный адаптер от ArrayAdapter, чтобы получить то, что вы хотите.

Существует множество хороших руководств по этому вопросу, как здесь:
учебник по настраиваемому списку просмотра

В соответствии с этим, вы можете попробовать что-то вроде этого:

public class MyAdapter extends ArrayAdapter<String> {

    private Context mContext;
    private ArrayList<String> list = new ArrayList<>();
    private boolean[] booleanArray;

    public MovieAdapter(@NonNull Context context, @LayoutRes ArrayList<String> list, boolean[] booleanArray) {
        super(context, 0 , list);
        mContext = context;
        this.list = list;
        this.booleanArray = booleanArray;
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if(convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.row_layout_checkbox,parent,false);
        }    
        String item = list.get(position);

        CheckBox checkBox = convertView.findViewById(R.id.checkBox);
        TextView textView = convertView.findViewById(R.id.textView_checkBox);

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                booleanArray[position] = isChecked;
            }
        });

        return convertView;
    }
}

Это должно в основном работать. Но я полагаю, что даже лучше было бы создать собственный класс модели данных, содержащий строку для TextView и проверенное состояние флажка. Затем вы расширяете свой пользовательский адаптер с ArrayAdapter<YourDataModel> вместо ArrayAdapter<String>. (Это то, что на самом деле показано в учебнике.)

...