У меня есть gridlayout в переработке .
отдельный элемент имеет вид изображения с рамкой и текстовый вид .
Изображение имеет векторную иконку .
При выборе (щелчок элемента) элемента цвет изображения, рамки и текста должен измениться, а старый элемент должен вернуться к обычному состоянию.
Таким образом, возможен только один выбор .
В настоящее время цвет только изображения изменяется на новый, а старый возвращается в нормальное состояние.
Я не могу добиться этого с рамкой и текстом.
Я должен использовать notifyItemChanged () и НЕ notifyDataSetChanged () в целях оптимизации.
При нажатии кнопки «Добавить 8» он выделяется, но старый пункт «Добавить 6» должен вернуться в нормальное состояние. Как будто звезда идет нормально, а границы и текст - нет.
Как добиться того же навыка для границы и текста?
Вот код класса адаптера, который я пробовал.
class imgAdapter extends RecyclerView.Adapter<imgAdapter.viewHolder> {
Context context;
List<String> mData;
int selectedPos = RecyclerView.NO_POSITION;
public imgAdapter(Context context, List<String> data) {
this.context = context;
this.mData = data;
}
//create holder
@Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
return new viewHolder(view,mData);
}
//bind the view to holder
@Override
public void onBindViewHolder(viewHolder holder, int position) {
holder.category.setText(mData.get(position));
holder.imgView.setImageResource(R.drawable.star_black);
holder.imgView.setSelected(selectedPos == position);
}
//get items size
@Override
public int getItemCount() {
return mData.size();
}
//view Holder class
public class viewHolder extends RecyclerView.ViewHolder {
TextView category;
ImageView imgView;
LinearLayout linearLayout;
int oldPos;
public viewHolder(final View itemView, final List<String> mData) {
super(itemView);
category = (TextView) itemView.findViewById(R.id.country);
imgView = (ImageView) itemView.findViewById(R.id.imageView);
linearLayout = (LinearLayout)itemView.findViewById(R.id.linearLayout);
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
oldPos = selectedPos;
notifyItemChanged(selectedPos); //reset color of old position
DrawableCompat.setTint(imgView.getDrawable(), ContextCompat.getColor(context, R.color.colorOrange)); //change color of selected position
DrawableCompat.setTint(imgView.getBackground(), ContextCompat.getColor(context, R.color.colorOrange)); //change border color of selected position
category.setTextColor(Color.parseColor("#F45642"));
selectedPos = getPosition(); // add new position as old position for next click
Toast.makeText(context, "old: " + oldPos, Toast.LENGTH_SHORT).show();
}
});
}
}
}
XML одного вида сетки:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="10dp"
android:id="@+id/linearLayout">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_gravity="center"
android:src="@drawable/star_black"
android:tint="@color/colorGrey"
android:background="@drawable/border"
android:backgroundTint="@color/colorPrimary"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/category"
android:layout_gravity="center"
android:layout_margin="10dp"
android:text="Categories"/>
</LinearLayout>
Спасибо.
Обновление:
Меня беспокоит, что уведомление изменяет только цвет изображения, а не цвет границы (который устанавливается как оттенок фона). Есть ли у нас поддержка с уведомлением?
Есть ли способ, где мы можем вручную установить что-то вроде, setbackground, где position == oldpos.
то есть что-то вроде: img [oldpos] .setBackground ()