将图像传递给同一类中的另一个函数

阴影Reogen:

我一直在寻找解决方案三天了。如果每个人都有一个想法,请帮助我,我什至不认为要实现这个目标实际上并不那么困难,但是如果您可以这样说的话,那也不是我的真正分支。

在一个RecyclerView中,该列表包含具有多个项目的列表,每个项目都有一个Title(TextView)和一个Cover image(ImageView)。

此数据是在适配器的ViewHolder中,更具体地说是在OnBind函数中设置的。

那我的问题在哪里呢?我创建了一个PopUp窗口,除了几个按钮外,还包含一个占位符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();
    }
}
达尼洛·莱姆斯(Danilo Lemes):

在OnBind方法中,通过Glide和gameViewHolder.Title.setText(currentItem.getTitle());将Image和Text正确关联到Item。现在,我创建了一个PopUp,它将从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所以?对于该项目,我们现在在方法中进行设置,而不是将设置为onClickListenerGameViewHolder构造函数中打开PopUp bind但是,它有什么好处呢?每次将数据绑定到数据视图时,我们都会准备Popup并显示数据。

应该改变什么?为了提高性能,我猜想,您应该实例化构造函数,然后每次使用新数据填充它,而不是每次onBindViewHolder调用都再次创建一个新实例

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

最好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将方法的返回值作为参数传递给同一类中的另一个方法

无法将实例变量的值从同一类中传递给另一个 (Ruby)

将last_inserted id从一个函数传递到codeigniter中同一类中的另一个函数

将ArrayList从一个方法传递到同一类中的另一个方法?

使用Jquery .each()函数隐藏图像,因为同一类中显示了另一个图像

将实例传递给同一类中的函数

从同一类中的另一个构造函数访问构造函数变量

如何从Angular中同一类中的另一个函数访问变量?

无法将变量从类中的函数传递给Swift中的另一个函数

Angular 6 - 尝试将函数传递给另一个类中的函数

将一个类中的数据传递给另一个类中的函数

PHP将一个类传递给另一个类构造函数

使用构造函数将一个类传递给另一个类

如何从同一类的另一个函数访问一个函数中的变量?

PHP从同一类中的另一个函数调用一个函数

将所有类方法传递给Ruby on Rails中的另一个函数

将动态值从一个函数传递给类中的另一个函数

将一个方法中的变量访问到同一类中的另一个方法

TextField不会将数据传递到同一类中的另一个Flutter Widget

如何将参数从一个函数传递到另一个函数,但在php中的同一个类中

如何将基本构造函数数据用于同一类中的另一个构造函数?

C ++试图将类传递给另一个类的构造函数

将模板类实例传递给另一个类的构造函数

Python:将类成员函数传递给另一个类的回调

将模板类的对象传递给另一个类的构造函数

Android recycleview将参数传递给同一活动中的另一个片段

将数组传递给另一个类

在同一类中使用另一个函数的输出

NameError:名称“ a”未定义。使用同一类中另一个函数的变量