我正在制作Android应用,目前有3种不同的活动。一个在Recyclerview中显示来自Flickr的“最近”图像,另一个在Recyclerview中显示来自Flickr的“有趣”图像,以及“详细信息< / strong>'活动,用于显示更大的图像视图以及单击特定照片时的更多信息。
我有两个ArrayLists: recentImageList 和 interestingImageList ,它们使用相同的Adapter类在Recyclerviews中显示不同的图像及其属性(标题,所有者等) ,取决于活动。
我正在进行这两项活动并展示正确的内容,当我点击“最近的”照片时,它会在“详细信息”页面上显示相同的“最近”照片。
然而我的问题是,当点击“有趣”的图片时,它会将“最近”图片的位置传递给Intent,而不是我点击的“有趣”图片的位置。因此,这会在“详情”活动中显示“最近”的图片,而不是我点击的“有趣”照片。
我不确定如何在onClickListener中传递interestingImageList数组项的正确位置,以便在我的“详细信息”活动中显示正确的相应图像。我是否需要在OnClickListener中使用某种if语句来确定将哪个arraylist位置传递给intent?
我很感激你们能给予的任何帮助。请参阅下面的ImageListAdapter类的代码:
public class ImageListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
ArrayList<ImageInfo> recentImageList;
ArrayList<ImageInfo> interestingImageList;
private int whichActivity;
public ImageListAdapter(Context context, ArrayList<ImageInfo> recentImageList,
ArrayList<ImageInfo> interestingImageList, int whichView) {
this.context = context;
this.recentImageList = recentImageList;
this.interestingImageList = interestingImageList;
whichActivity = whichView;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.cell_image_card, parent, false);
return new ImageViewHolder(itemView);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (whichActivity == 0) {
((ImageViewHolder) viewHolder).populate(recentImageList.get(position));
ImageInfo recentInfo = recentImageList.get(position);
} else if (whichActivity == 1) {
((ImageViewHolder) viewHolder).populate(interestingImageList.get(position - recentImageList.size()));
ImageInfo interestingInfo = interestingImageList.get(position);
}
}
@Override
public int getItemCount() {
return recentImageList.size() + interestingImageList.size();
}
public class ImageViewHolder extends RecyclerView.ViewHolder {
public TextView imageTitle, ownerTitle, tags;
public NetworkImageView mainImage, ownerImage;
public ImageViewHolder(View itemView) {
super(itemView);
imageTitle = (TextView) itemView.findViewById(R.id.imageTitle);
ownerTitle = (TextView) itemView.findViewById(R.id.ownerTitle);
mainImage = (NetworkImageView) itemView.findViewById(R.id.mainImage);
mainImage.setOnClickListener(onClick);
ownerImage = (CircularNetworkImageView) itemView.findViewById(R.id.ownerImage);
}
public void populate(ImageInfo imageInfo) {
ownerTitle.setText(imageInfo.owner);
imageTitle.setText(imageInfo.title);
mainImage.setImageUrl(imageInfo.url_m, NetworkMgr.getInstance(context).imageLoader);
ownerImage.setImageUrl(imageInfo.ownerPic, NetworkMgr.getInstance(context).imageLoader);
}
View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, DetailsActivity.class);
int position = ImageViewHolder.this.getLayoutPosition();
intent.putExtra("PHOTO_POSITION", position);
context.startActivity(intent);
}
};
}
}
答案 0 :(得分:0)
您需要两个不同的适配器实例,每个实例对应一个列表,这似乎是一个错误的实现
每个recyclerview都应该有自己的适配器实例。 e.g。
new
ImageListAdapter(this, recentImageList, null, whichView);
和
new
ImageListAdapter(this, null , interestingImageList,whichView);
答案 1 :(得分:0)
对于两个不同的RecyclerView,您将需要两个适配器实例。要转到详细信息活动,最好在活动中获取所选或单击的项目位置,并从当前活动开始详细信息活动。要从适配器获取所选位置,您可以使用界面。这是一个开源RecyclerView-Listener库,用于获取所选项目位置。您可以使用它或理解概念并自己实现。
答案 2 :(得分:0)
谢谢大家的帮助!我修好了!
我意识到我的原始代码是正确的,但是我的详细信息活动中的行: photo = NetworkMgr.getInstance(this).recentImageList.get(photoPosition); 是问题,因为这条线仅检索了最近图像的位置,并没有考虑到有趣的图像。因此,在我的OnClickListener中,我使用了一个if语句为两个whereActivitys和putExtra一个数字来确定哪个arraylist需要在Details活动中检索其位置。见下文:
ImageListAdapter -
View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (whichActivity == 0) {
Intent intent = new Intent(context, DetailsActivity.class);
int position = ImageViewHolder.this.getLayoutPosition();
int imageListCode = 1;
intent.putExtra("PHOTO_POSITION", position);
intent.putExtra("IMAGELIST_CODE", imageListCode);
context.startActivity(intent);
}
else if (whichActivity == 1) {
Intent intent = new Intent(context, DetailsActivity.class);
int position = ImageViewHolder.this.getLayoutPosition();
int imageListCode = 2;
intent.putExtra("PHOTO_POSITION", position);
intent.putExtra("IMAGELIST_CODE", imageListCode);
context.startActivity(intent);
}
}
};
DetailsActivity -
Intent intent = getIntent();
photoPosition = intent.getIntExtra("PHOTO_POSITION", 0);
code = intent.getIntExtra("IMAGELIST_CODE", 0);
if (code == 1) {
photo = NetworkMgr.getInstance(this).recentImageList.get(photoPosition);
}
else if (code == 2) {
photo = NetworkMgr.getInstance(this).interestingImageList.get(photoPosition);
}