Что я сделал: Я создал простое сеточное представление с двумя столбцами и пользовательским адаптером, используя 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"
/>