如何设置OnClickListener以使用相同的Adapter java类获取不同ArrayLists的位置?

时间:2017-12-17 03:32:50

标签: java android arraylist onclicklistener android-viewholder

我正在制作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);
            }
        };
    }
}

3 个答案:

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