notifyOnItemChanged не меняет цвет границы и текст - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть gridlayout в переработке . отдельный элемент имеет вид изображения с рамкой и текстовый вид . Изображение имеет векторную иконку .

При выборе (щелчок элемента) элемента цвет изображения, рамки и текста должен измениться, а старый элемент должен вернуться к обычному состоянию. Таким образом, возможен только один выбор .

В настоящее время цвет только изображения изменяется на новый, а старый возвращается в нормальное состояние. Я не могу добиться этого с рамкой и текстом.

Я должен использовать notifyItemChanged () и НЕ notifyDataSetChanged () в целях оптимизации.

Please check the image. При нажатии кнопки «Добавить 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>

Спасибо.


Обновление:

  1. Меня беспокоит, что уведомление изменяет только цвет изображения, а не цвет границы (который устанавливается как оттенок фона). Есть ли у нас поддержка с уведомлением?

  2. Есть ли способ, где мы можем вручную установить что-то вроде, setbackground, где position == oldpos.
    то есть что-то вроде: img [oldpos] .setBackground ()

1 Ответ

0 голосов
/ 05 апреля 2019

Сначала создайте изображение text_selector.xml в папке для рисования, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/red" android:state_selected="true" />
    <item android:color="@android:color/red" android:state_focused="true" />
    <item android:color="@android:color/gray" />
</selector>

Затем передайте этот "text_selector.xml" как текстовый цвет в элементе просмотра повторного просмотра для просмотра текста. Также вы звоните notifyItemChanged только для старой позиции, а также вы не уведомляете об изменении нового элемента. поэтому, пожалуйста, измените "itemView.setOnClickListener", как показано ниже:

itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    if(oldPos != RecyclerView.NO_POSITION){
                        notifyItemChanged(oldPos); //reset color of old position
                    }

                    oldPos = selectedPos;

                    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"));
                    // comment this line and put text_selector drawable as textColor in xml

                    notifyItemChanged(selectedPos); //reset color of new position

                    selectedPos = getPosition();     // add new position as old position for next click

                    Toast.makeText(context, "old: " + oldPos, Toast.LENGTH_SHORT).show();
                }
            });

Затем измените ваш onBindViewHolder, как показано ниже:

//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);
        if(selectedPos == position){
            holder.category.setSelected(true);
            holder.imgView.setSelected(true);   
        }else{
            holder.category.setSelected(false);
            holder.imgView.setSelected(false);
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...