Как сохранить проверенное состояние в CheckedTextView в GridView? - PullRequest
0 голосов
/ 27 апреля 2020

Что я сделал: Я создал простое сеточное представление с двумя столбцами и пользовательским адаптером, используя AaseAdapter с ImageView и CheckedTextView. Время от времени, когда кнопка нажимает, мой вид сетки заполняется элементами вида сетки. Это хорошо работает. Вся эта работа находится внутри фрагмента в Android Studio.

Что я ищу: Когда я щелкаю один элемент в сетке, я хочу, чтобы флажок (в CheckedTextView) находился в состоянии 'checked true'. Это действие ограничено использованием условия if (если текст выделенных элементов содержит определенное имя), так что будет проверяться только соответствующий элемент.

Моя попытка: Сначала я попытался сохранить состояние «проверено истинно» для всех элементов вида сетки, но мне не удалось этого достичь. Каждый раз, когда я щелкаю элемент сетки, появляется отмеченная метка, и она внезапно исчезает. Это происходит, когда у меня несколько элементов в виде сетки. Я могу выбрать и отметить отмеченные для нескольких элементов, но состояние не сохраняется. После некоторых поисков я обновил свой CustomAdapter, добавив checkedTextView.setOnClickListener и SparseBooleanArray. Я также сослался на этот пример. Но я использую CheckedTextView.

Далее я попытался добавить условие if, чтобы проверять только 1 соответствующий элемент. Но все же вышеприведенное наблюдение имело место. Каждый раз, когда я выбираю элемент сетки, флажок true происходит независимо от того, какой элемент выбран, и через секунду он исчезает.

Буду очень признателен за любые предложения по этому вопросу - как сохранить checked true указано в CheckedTextView внутри GridView, когда я щелкнул элемент.

Пользовательский адаптер:

public class GridViewDeviceAdapterBase extends BaseAdapter {

    private  LayoutInflater layoutInflater;
    private Context context;
    private String[] deviceName;
    private int[] deviceImage;
    //to select checkbox
    private SparseBooleanArray mSelectedItemsIds;

    public GridViewDeviceAdapterBase(Context c,String [] deviceNm , int [] deviceIm){
        this.context = c;
        this.deviceImage = deviceIm;
        this.deviceName = deviceNm;
        mSelectedItemsIds = new SparseBooleanArray();

    }

    @Override
    public int getCount() {
        return deviceName.length;
    }

    @Override
    public Object getItem(int position) {
        return deviceName[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if ( layoutInflater==null){
            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.grid_view_items,null);
        }

         CheckedTextView checkedTextView = (CheckedTextView) convertView.findViewById(R.id.checkedTextView);
         ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);

         checkedTextView.setText(deviceName[position]);
         imageView.setImageResource(deviceImage[position]);

        checkedTextView.setChecked(mSelectedItemsIds.get(position));

        checkedTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkCheckBox(position,!mSelectedItemsIds.get(position));
            }
        });

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkCheckBox(position,!mSelectedItemsIds.get(position));
            }
        });

        return convertView;
    }


    public void checkCheckBox(int position, boolean value) {
        if (value)
            mSelectedItemsIds.put(position, true);
        else
            mSelectedItemsIds.delete(position);

        notifyDataSetChanged();
    }


    public void removeSelection() {
        mSelectedItemsIds = new SparseBooleanArray();
        notifyDataSetChanged();
    }


    public SparseBooleanArray getSelectedIds() {
        return mSelectedItemsIds;
    }

}

Фрагмент:

GridViewDeviceAdapterBase listAdapter = new GridViewDeviceAdapterBase(getActivity(), displayList,displayImages);

deviceListGridView.setAdapter(listAdapter);

deviceListGridView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
deviceListGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectedItemPos = position;

        selectedAddress = mList[position];
        selectedName = nameList[position];
        selectedDevicePos = position;

        try {
            mCallBack.onSelected(mList[position], nameList[position]);
        } catch (ClassCastException cce) {

        }
    }
});

if(selectedAddress !=null){

    for(int i = 0 ; i< deviceListGridView.getAdapter().getCount();i++){
String.valueOf(deviceListGridView.getAdapter().getCount()));
        View view = getViewByPosition(i, deviceListGridView);
        CheckedTextView checkedTextView = (CheckedTextView) view.findViewById(R.id.checkedTextView);
       if(checkedTextView != null) {
            String text = checkedTextView.getText().toString();
            if (text.contains("IN")) {
                deviceListGridView.setItemChecked(i, true);
            } else {
                deviceListGridView.setItemChecked(i, false);
            }
       }
    }

}


public View getViewByPosition(int pos, GridView gridView) {
    final int firstListItemPosition = gridView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + gridView.getChildCount() - 1;
    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return gridView.getAdapter().getView(pos, null, gridView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return gridView.getChildAt(childIndex);
    }
}

Элемент GridView - относительная компоновка. xml:

<FrameLayout
    android:id="@+id/deviceFrame"
    android:layout_width="163dp"
    android:layout_height="161dp"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="30dp"
    android:layout_marginEnd="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginBottom="30dp"
    tools:ignore="UselessParent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="120dp"
        android:layout_height="119dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="30dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:contentDescription="Device"
        android:padding="5dp"
        android:scaleType="fitXY"
        android:src="@drawable/img" />

  <CheckedTextView
        android:id="@+id/checkedTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:padding="10dp"
        android:text="name"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1"
        android:textColor="@color/black" />

</FrameLayout>

Фрагмент - относительное расположение. xml:

  <GridView
       android:id="@+id/simpleGridView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:numColumns="2"
       android:verticalSpacing="2dp"
       />
...