【问题标题】:Pass Image to another function within same class将图像传递给同一类中的另一个函数
【发布时间】:2019-07-14 14:31:15
【问题描述】:

我已经寻找了三天的解决方案。 如果大家有idea请帮帮我,我什至觉得实现起来其实没有那么难,但如果你能这样说,这不是我的分支。

在 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();
    }
}

【问题讨论】:

  • 我似乎无法理解您的问题到底是什么... 绑定后图片和文字不显示?你能解释一下吗?请
  • OnBind方法中,Image和Text通过Glide和gameViewHolder.Title.setText(currentItem.getTitle());正确关联到Items。现在,我创建了一个 PopUp,它应该从 RecyclerView 中单击的项目中获取图像和文本
  • 我试图通过getAdapterPosition 或其他方式获取单个项目,但我失败了,并且找不到使用方法getCover 的方法,该方法在我的GameItem 类中的@987654328 中定义@

标签: java android arrays image popupwindow


【解决方案1】:

在 OnBind 方法中,Image 和 Text 与 Items 相关联 正确地,通过 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);
    }
}

发生了什么变化? 首先,我们现在在ViewHolder 中有一个名为bind 的方法,我们负责从Adapter 设置数据并将其委托给ViewHolder。 其次,由于每次调用onBindViewHolder 时都会调用该方法,因此您将拥有实际的GameItem。所以?使用该项目,我们现在在bind 方法中设置它,而不是设置onClickListener 以在GameViewHolderconstructor 中打开弹出窗口。但是,它有什么好处呢?每次我们将数据绑定到它的视图时,我们都会准备 Popup 然后显示它。

应该改变什么? 出于性能考虑,我猜你应该实例化构造函数,然后每次都用新数据填充它,而不是每次调用 onBindViewHolder 时都再次创建一个新实例。

编辑:由于我不知道您的弹出视图 ID,因此我创建了一些虚拟 ID。希望你能理解。

最好的。

【讨论】:

  • 非常感谢,很多人只是粘贴了正确的代码,您还继续解释它!代码完美运行,我唯一需要更改的是,在主活动中,添加 Clicklistener 作为参数,完成了,现在它可以工作了!!如果你不明白我的意思:GameListAdapter = new GameViewAdapter(GameList, (GameViewAdapter.OnItemClickListener) GameViewAdapter.OnItemClickListener); 看起来像 GameListAdapter = new GameViewAdapter(GameList
  • 不客气,伙计。如果您有任何其他疑问,请随时询问
猜你喜欢
  • 2021-12-18
  • 2011-09-11
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2011-03-31
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多