gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:18:56 25 4
gpt4 key购买 nike

三天来我一直在寻找解决方案。如果大家有idea请帮帮我,我什至不认为实现起来有那么难,但它不是我的分支,如果你能这样说的话。

在包含多个项目的列表的 RecyclerView 中,每个项目都有一个标题 (TextView) 和一个封面图像 (ImageView)。

此数据在 Adapter 中设置,在 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();
}
}

最佳答案

In the OnBind method, the Image and Text are associated to the Items correctly, through Glide and gameViewHolder.Title.setText(currentItem.getTitle());. Now, I have created a PopUp, which should get the Image and the Text from the clicked item in the 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 的数据并将其委托(delegate)给ViewHolder。其次,由于每次调用 onBindViewHolder 时都会调用该方法,因此您将拥有实际的 GameItem。所以?对于该项目,我们现在在 bind 方法中设置它,而不是在 GameViewHolder 构造函数中设置 onClickListener 以打开 PopUp。但是,它有什么好处呢?每次我们将数据绑定(bind)到它的 View 时,我们都会准备我们的 Popup 然后显示它。

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

编辑:由于我不知道您的弹出 View ID,因此我创建了一些虚拟 ID。希望你明白。

最好的。

关于java - 将图像传递给同一类中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com