Запрос примера для RecyclerViewAdapter.notifyItemChanged для просмотра изображений - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу использовать одну из кнопок в моих обзорах Recycler, чтобы изменить один объект в обзоре Recycler, а именно, говоря, установив прозрачность для Imageview.

Итак, я обнаружил, что мне нужно использовать notifyItemChanged (int, object, payload) для этого случая, смотрите эту ветку: ( Пример NotifyItemChanged ). К сожалению, этот пример не подходит для того, как использовать значение объекта для изменения значения изображения (ImageView.setImageAlpha (70)).

Запрос:

Можете ли вы дать мне пример того, как изменить значение setImageAlpha один объекта ImageView в Recycleradapter с помощью notifyItemChanged.

Мои рамки

Я опубликую свой код, так что если вы хотите, вы можете отредактировать его соответствующим образом. Но я тоже могу попытаться сделать это сам.

public class deckbuilder_RViewAdapter_Card extends RecyclerView.Adapter<deckbuilder_RViewAdapter_Card.ViewHolder > {


    private List<Cards> mData;
    private List<Heros> mHero, mHeroAdd;
    private List<Spells> mSpell, mSpellSig;
    private List<Items> mItem;
    private List<Improvements> mImpr, mImprSig;
    private List<Creeps> mCreep, mCreepSig;
    private List<Decklist> mDecklist;
    private List<Decklist_Heros> mDecklistHeros;
    DBHelper dbHelper;

    private CardView introCardview;
    private Context mContext;
    private RecyclerView mrvList,mrvHeros;
    private deckbuilder_RViewAdapter_List mRViewAdapterList;
    private deckbuilder_RViewAdapter_Heros mRViewAdapterHeros;

    private int questionmarkNo;

    public deckbuilder_RViewAdapter_Card (FragmentActivity mContext, List<Cards> mData, deckbuilder_RViewAdapter_List mRViewAdapterList, List<Decklist> mDecklist, RecyclerView rvList, deckbuilder_RViewAdapter_Heros mRViewAdapterHeros, List<Decklist_Heros> mDecklistHeros, RecyclerView rvHeros) {
        this.mData = mData;
        this.mContext = mContext;
        this.mRViewAdapterList = mRViewAdapterList;
        this.mDecklist = mDecklist;
        this.mrvList = rvList;
        this.mRViewAdapterHeros = mRViewAdapterHeros;
        this.mDecklistHeros = mDecklistHeros;
        this.mrvHeros= rvHeros;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        dbHelper = new DBHelper(mContext.getApplicationContext());
        dbHelper.createDataBase();// used for clickable

        //Todo change inflated layout later on <-????
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_cardview_deckbuilder_cards, viewGroup, false);
        return new deckbuilder_RViewAdapter_Card.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
        viewHolder.ivCardImage.setImageResource(mData.get(position).getCardImage());
        viewHolder.tvCardName.setText(mData.get(position).getCardName());
        viewHolder.ivCardImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cardClickable(position);
            }
        });
        viewHolder.tvCardName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cardClickable(position);
            }
        });

        /* Init the Add and Remove button */
        viewHolder.civ_deckbuilder_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mData.get(position).getCardType().equals("hero")){
                    addHero(viewHolder, position);

                }else {
                    addOtherCards(viewHolder,position);
                }
            }
        });

        viewHolder.civ_deckbuilder_remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mData.get(position).getCardType().equals("hero")){
                    removeHero(position);
                    **viewHolder.ivCardImage.setImageAlpha(70);**
                }else {
                    removeOtherCard(position);
                    **viewHolder.ivCardImage.setImageAlpha(70);**
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        CircleImageView civ_deckbuilder_add, civ_deckbuilder_remove, civ_deckbuilder_number;
        ImageView ivCardImage;
        TextView tvCardName;

        public ViewHolder(@NonNull View introListView) {
            super(introListView);
            ivCardImage = introListView.findViewById(R.id.ivDeckbuilder_img);
            tvCardName = introListView.findViewById(R.id.tvDeckbuilder_title);
            civ_deckbuilder_add = introListView.findViewById(R.id.civ_deckbuilder_add);
            civ_deckbuilder_remove = introListView.findViewById(R.id.civ_deckbuilder_remove);
        }
    }

    //[...] used methods should not be relevant.

}

Спасибо за любую помощь, которую вы можете предложить мне!

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Ваша кнопка живет за пределами RecyclerView?

Предполагая, что это так, предоставьте в вашем адаптере метод, который принимает позиционное значение и значение, на которое вы хотите изменить. Вам также понадобится метод для изменения любого элемента, который вы хотите в ViewHolder.

Как-то так должно работать ...

В вашем адаптере:

public void updateItem(int position, Object object) {
    mData.set(object, position);
    notifyItemChanged(position);
}

На ваш взглядХолдер:

public void modifyAlpha(int alpha) {
   imageView.setAlpha(alpha);
}

В вашем clickListener для действия:

public void onRecyclerClick(int position, Object object) {
    ViewHolder h = recyclerView.findViewHolderForAdapterPosition(adapterPosition);
    h.modifyAlpha(alpha);
    recyclerView.notifyUpdate(position, object);
}

Надеюсь, это поможет!

0 голосов
/ 16 ноября 2018
  1. Прежде всего ваш класс данных Cards должен иметь свойство alpha , которое инициализируется значением 255 для полностью видимого изображения.

  2. В onBindViewHolder использовать

    viewHolder.ivCardImage.setImageAlpha(mData.get(position).getAlpha());

  3. Тогда в вашем клике событие

    @Override public void onClick(View view) { .... mData.get(position).setAlpha(70); notifyItemChanged(position); } }

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