Передать изображение в другую функцию в том же классе - PullRequest
0 голосов
/ 20 февраля 2019

Я искал решение уже три дня.Если у каждого есть идея, пожалуйста, помогите мне, я даже не думаю, что на самом деле это так сложно достичь, но это не совсем моя ветвь, если вы можете сказать это так.

В RecyclerView, содержащем список с несколькимиЭлементы, каждый из которых имеет заголовок (TextView) и изображение обложки (ImageView).

Эти данные задаются в адаптере, в ViewHolder, более конкретно в функции OnBind.

Так где моя проблема?Я создал всплывающее окно, которое содержит помимо нескольких кнопок заполнитель ImageView и заполнитель TextView.Кажется, я не могу найти способ поместить данные выбранного элемента в список внутри заполнителей.Я думаю, что он похож на метод OnBind, но он не работает.

Вот Адаптер (если нужен код для GameItem, я с удовольствием выложу его):

import java.util.ArrayList;

public class GameViewAdapter extends RecyclerView.Adapter<GameViewAdapter.GameViewHolder> {
    private ArrayList<GameItem> mGameList;
    private OnItemClickListener mListener;

    public interface OnItemClickListener{
        void onGameClick(int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener){
        mListener =listener;
    }
    public static class GameViewHolder extends RecyclerView.ViewHolder{
        public ImageView Cover;
        public TextView Title;
        public TextView Description;
        public PopupWindow popupWindow;
        public ImageView popUpImage;
        public TextView PopUpTitle;
        public EditText customAmount;
        public Button add;
        private Button addcustom;
        private  Button exit;

        public GameViewHolder(final View itemView, final OnItemClickListener listener) {
            super(itemView);
            add = itemView.findViewById(R.id.addaverage);
            addcustom = itemView.findViewById(R.id.addcustom);
            popUpImage = itemView.findViewById(R.id.popupimg);
            PopUpTitle = itemView.findViewById(R.id.popuptitle);
            customAmount = itemView.findViewById(R.id.gameamount);
            Cover = itemView.findViewById(R.id.GameCover);
            Title = itemView.findViewById(R.id.GameTitle);
            Description = itemView.findViewById(R.id.GameAmount);
            exit = itemView.findViewById(R.id.exit);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showPopUp();
                }
            });
        }

        public void showPopUp() {
            final View popupView = LayoutInflater.from(itemView.getContext()).inflate(R.layout.popup, null);
            final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
            exit = popupView.findViewById(R.id.exit);
            exit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popupWindow.dismiss();
                }
            });
            popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

        }
    }

    public GameViewAdapter(ArrayList<GameItem> gameList){
        mGameList = gameList;
    }





    @Override
    public GameViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        Context context = viewGroup.getContext();
        View v = LayoutInflater.from(context).inflate(R.layout.game_entry, viewGroup, false);
        GameViewHolder GVH = new GameViewHolder(v, mListener);
        return GVH;
    }


        @Override
    public void onBindViewHolder(@NonNull GameViewHolder gameViewHolder, int position){
        GameItem currentItem = mGameList.get(position);
        Glide.with(gameViewHolder.Cover).load(currentItem.getCover()).into(gameViewHolder.Cover);
        gameViewHolder.Title.setText(currentItem.getTitle());
        gameViewHolder.Description.setText(currentItem.getDescription());

    }

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

1 Ответ

0 голосов
/ 20 февраля 2019

В методе OnBind изображение и текст правильно связываются с элементами через Glide и gameViewHolder.Title.setText (currentItem.getTitle ()) ;.Теперь я создал всплывающее окно, которое должно получать изображение и текст из элемента, по которому щелкнули в RecyclerView.

Я переупорядочил некоторые методы и свойства для ясности, а затем, затем,Я объясню.

public class GameViewAdapter extends RecyclerView.Adapter<GameViewAdapter.GameViewHolder> {

    private ArrayList<GameItem> mGameList;
    private OnItemClickListener mListener;

    public GameViewAdapter(ArrayList<GameItem> mGameList, GameViewAdapter.OnItemClickListener mListener) {
        this.mGameList = mGameList;
        this.mListener = mListener;
    }

    @Override
    public GameViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        Context context = viewGroup.getContext();
        View v = LayoutInflater.from(context).inflate(R.layout.game_entry, viewGroup, false);
        GameViewHolder GVH = new GameViewHolder(v, mListener);
        return GVH;
    }

    @Override
    public void onBindViewHolder(@NonNull GameViewHolder gameViewHolder, int position){
        gameViewHolder.bind(mGameList.get(position));
    }

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

    class GameViewHolder extends RecyclerView.ViewHolder {

        private ImageView itemCover;
        private TextView itemTitle;
        private TextView itemDescription;
        private PopupWindow popupWindow;
        private ImageView popUpImage;
        private TextView PopUpTitle;
        private EditText customAmount;
        private Button add;
        private Button addcustom;
        private Button exit;

        public GameViewHolder(View itemView, GameViewAdapter.OnItemClickListener mListener) {
            super(itemView);
            setupViews(itemView);
        }

        public void bind(GameItem gameItem) {
            Glide.with(this.itemCover).load(gameItem.getCover()).into(this.itemCover);
            this.itemTitle.setText(gameItem.getTitle());
            this.itemDescription.setText(gameItem.getDescription());
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showPopUp(itemView, gameItem);
                }
            });
        }

        private void setupViews(View itemView) {
            add = itemView.findViewById(R.id.addaverage);
            addcustom = itemView.findViewById(R.id.addcustom);
            popUpImage = itemView.findViewById(R.id.popupimg);
            PopUpTitle = itemView.findViewById(R.id.popuptitle);
            customAmount = itemView.findViewById(R.id.gameamount);
            itemCover = itemView.findViewById(R.id.GameCover);
            itemTitle = itemView.findViewById(R.id.GameTitle);
            itemDescription = itemView.findViewById(R.id.GameAmount);
            exit = itemView.findViewById(R.id.exit);
        }

        private void showPopUp(View itemView, GameItem gameItem) {
            final View popupView = LayoutInflater.from(itemView.getContext()).inflate(R.layout.popup, null);
            final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);

            final ImageView popupItemCover = popupView.findViewById(R.id.popupItemCover);
            final TextView popupItemTitle = popupView.findViewById(R.id.popupItemTitle);

            Glide.with(popupItemCover).load(gameItem.getCover()).into(popupItemCover);
            popupItemTitle.setText(gameItem.getTitle());

            exit = popupView.findViewById(R.id.exit);
            exit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popupWindow.dismiss();
                }
            });
            popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
        }

    }

    public interface OnItemClickListener{
        void onGameClick(int position);
    }
}

Что изменилось?Во-первых, теперь у нас есть метод под названием bind внутри нашего ViewHolder, мы взяли на себя ответственность за установку данных из нашего Adapter и делегировали их в ViewHolder.Во-вторых, так как этот метод вызывается каждый раз, когда вызывается onBindViewHolder, у вас будет фактический GameItem.Так?С этим элементом вместо установки onClickListener для открытия всплывающего окна в конструкторе GameViewHolder мы теперь устанавливаем его в методе bind.Но каковы преимущества от этого?Каждый раз, когда мы привязываем данные к их представлениям, мы подготавливаем наш Popup, а затем показываем его.

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

Редактировать: так как я этого не делаюзнаю ваши идентификаторы всплывающих окон, я создал несколько фиктивных идентификаторов.Надеюсь, вы понимаете.

Best.

...