繁体   English   中英

如何使用相同的Adapter Java类将OnClickListener设置为获取不同ArrayList的位置?

[英]How to set OnClickListener to get position of different ArrayLists using same Adapter java class?

我正在制作一个Android应用,目前有3种不同的活动。 一个在Recyclerview中显示来自Flickr的“ 最近 ”图像,另一个在Recyclerview中显示来自Flickr的“ 有趣 ”图像,以及“ Details ”( 详细信息 )活动,该活动显示较大的图像视图以及有关特定照片的更多信息。点击。

我有两个ArrayLists: 最近图像列表趣味图像列表 ,它们使用相同的Adapter类在其Recyclerviews中显示不同的图像及其属性(标题,所有者等),具体取决于活动。

我正在进行这两项活动并显示正确的内容,当我单击“最近的”照片时,它在“详细信息”页面上显示了相同的“最近的”照片。

但是我的问题是,当单击“有趣”图像时,它将“最近”图像的位置传递到Intent,而不是我单击的“有趣”图像的位置。 因此,这将在“详细信息”活动中显示“近期”图像,而不是我单击的“有趣”照片。

我不确定如何在我的onClickListener中传递有趣的ImageList数组项的正确位置,以便在“详细信息”活动中显示正确的对应图像。 我是否需要在OnClickListener中使用某种if语句来确定将哪个arraylist位置传递给该意图?

谢谢您能提供的任何帮助。 请参见下面的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);
            }
        };
    }
}

您需要两个不同的适配器实例,每个实例用于每个列表,这似乎是错误的实现

每个recyclerview应该具有自己的适配器实例。 例如

new 
ImageListAdapter(this, recentImageList, null, whichView);

new 
    ImageListAdapter(this, null , interestingImageList,whichView);

对于两个不同的RecyclerView,您将需要两个适配器实例。 要转到明细活动,最好获得活动中选定或单击的项目位置,然后从当前活动开始明细活动。 要从适配器获取选定位置,可以使用界面。 这是一个开源的RecyclerView-Listener库,用于获取所选项目的位置。 您可以使用它或理解概念并实现自己。

谢谢你们每一个人的帮助! 我已经解决了!

我意识到我的原始代码是正确的,但是我的Details Activity中的这一行是:photo = NetworkMgr.getInstance(this).recentImageList.get(photoPosition); 就是问题所在,因为此行仅检索最近图像的位置,而没有考虑有趣的图像。 因此,在我的OnClickListener中,我为两个whichActivitys和putExtra使用了if语句,以确定一个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);
            }
    }
    };

详细活动-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM