«Меня больше всего интересует стандартный способ сделать это в соответствии с инструкциями по разработке материалов и/или наиболее распространенным способом».
Я не уверен, что мой ответ материальный или общий, но я сделал GridView, основанный на обработке выбора в приложении Google «Фотографии». Я протестировал его и знаю, что он будет включать выделенную границу и «флажок».
** дисклеймеры **
Я считал, используя селектор, но там, кажется, с этим проблем, если ваш вид свитки (см this). Кроме того, я использовал пользовательский флажок (на самом деле всего две разные возможности), частично из-за this. Кроме того, этот ответ в основном обрабатывает телефон в портретном режиме. Необходимо добавить дополнительные элементы для обработки различных конфигураций (размер экрана, ориентация и т. Д.)
Здесь много, но, как я уже сказал, я его протестировал. Конечно, я не буду включать весь проект, но если вам нужно, я могу отправить его в GitHub. В любом случае, я это сделаю.
первый в MainActivity OnCreate()
mList = new ArrayList<>();
// fill your list here
mAdapter = new GridAdapter(getApplicationContext(), R.layout.grid_item, mList);
GridView gridView = (GridView)findViewById(R.id.grid_view);
gridView.setAdapter(mAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Log.d(TAG, "item clicked = " + i);
boolean isSelected = mList.get(i).isSelected();
mList.get(i).setSelected(!isSelected);
mAdapter.notifyDataSetChanged();
}
});
Далее overide GetView() в адаптере (я использую ArrayAdapter)
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
RelativeLayout itemLayout;
GridItem gridItem = (GridItem)getItem(position);
// use existing Views when we can
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemLayout = (RelativeLayout) inflater.inflate(R.layout.grid_item, null);
} else {
itemLayout = (RelativeLayout) convertView;
}
// get your bitmap or list item etc. here
BitmapDrawable bitmap = gridItem.getBitmap();
ImageView imageView = (ImageView)itemLayout.findViewById(R.id.image_view);
imageView.setBackground(bitmap);
if(gridItem.isSelected()) {
final int PADDING = 16;
Log.d(TAG, "position " + position + " is selected");
itemLayout.findViewById(R.id.image_frame).setPadding(PADDING, PADDING, PADDING, PADDING);
itemLayout.findViewById(R.id.custom_check_box)
.setBackgroundResource(R.drawable.custom_check_box_selected);
} else {
Log.d(TAG, "postion " + position + " is NOT selected");
itemLayout.findViewById(R.id.image_frame).setPadding(0,0,0,0);
itemLayout.findViewById(R.id.custom_check_box)
.setBackgroundResource(R.drawable.custom_check_box_unselected);
}
return itemLayout;
}
Вот ядро класса GridItem, оставил геттеры & сеттеры.
public class GridItem {
private BitmapDrawable bitmap = null;
private boolean isSelected = false;
public GridItem(BitmapDrawable bitmap) {
this.bitmap = bitmap;
}
}
Это все для Java. Теперь некоторые XML
grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
>
<FrameLayout
android:layout_width="140dp"
android:layout_height="140dp"
android:id="@+id/image_frame"
>
<!-- view for the main image -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:background="@android:color/white"
android:id="@+id/image_view"
/>
</FrameLayout>
<!-- view for the 'checkbox' in upper left corner -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:src="@drawable/custom_check_box_unselected"
android:id="@+id/custom_check_box"
/>
</RelativeLayout>
И это пойти бы в content_main.xml или activity_main.xml и т.д.
<GridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:verticalSpacing="10dp"
android:horizontalSpacing="20dp"
android:stretchMode="columnWidth"
android:gravity="center"
android:id="@+id/grid_view"
>
</GridView>
И теперь 2 файлов для вашей вытяжке папки.
custom_check_box_unselected.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="20dp"
android:width="20dp"
android:viewportWidth="400"
android:viewportHeight="400">
<!-- the outside box -->
<!-- top line & top left corner -->
<path android:pathData="M 340 30 H 62 c -20 0 -35 15 -35 35 "
android:strokeColor="#000000" android:strokeWidth="20" />
<!-- left line & bottom left corner -->
<path android:pathData="M 27 64 v271 c0 20 15 35 35 35 "
android:strokeColor="#000000" android:strokeWidth="20" />
<!-- bottom line & bottom right corner -->
<path android:pathData="M 60 370 h275 c20 0 35 -15 35 -35"
android:strokeColor="#000000" android:strokeWidth="20" />
<!-- right line & top right corner -->
<path android:pathData="M 370 336 v -271 c0 -20 -15 -35 -35 -35"
android:strokeColor="#000000" android:strokeWidth="20" />
</vector>
custom_check_box_selected.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="20dp"
android:width="20dp"
android:viewportWidth="400"
android:viewportHeight="400">
<!-- the outside box -->
<path android:pathData="M 340 30 H 62 c -20 0 -35 15 -35 35
v271 c0 20 15 35 35 35
h275 c20 0 35 -15 35 -35
v -271 c0 -20 -15 -35 -35 -35 "
android:fillColor="#FDD835" android:strokeColor="#000000" android:strokeWidth="20" />
<!-- the check mark -->
<path android:pathData="M 140 320 l -100 -100 25 -30
l 75 75 l 190 -190
l 25 30 l -190 190"
android:fillColor="#000000" android:strokeColor="#000000" android:strokeWidth="2" />
</vector>
listview имеет подходящее приложение: селектор. Попробуйте использовать это, для этого вам нужно создать xml-файл в выпадающей папке, который содержит выбранное значение true или по умолчанию false, где вы можете назначить цвета –
@Mohammad вы можете предоставить нам ожидаемые скриншоты и текущий рабочий скриншот, чтобы он даст больше разъяснений при интерпретации ваших ожиданий. – ChaitanyaAtkuri