java - 如何确定在 recyclerview 布局上单击了哪个卡片 View ?

标签 java android-recyclerview android-adapter android-cardview

例如,我有一个 UI,其中每个 recycleView“位置”包含两个 CardView,如下所示:

Image

在使用 recycleview.view 持有者时,我可以使用“getAdapterPosition()”onClick 方法确定用户单击屏幕的位置,但我无法确定它是哪个卡片 View ,即左侧或右侧右卡 View (例如在这个 Image 示例中 - 给定位置为 0,我无法确定它是“播客”还是“图表”)

如何确定用户单击了哪个卡片 View - 即向左还是向右?

下面是我的 RecycleViewAdpater 代码:

public class DisplayGenresRecyclerViewAdapter extends RecyclerView.Adapter<DisplayGenresRecyclerViewAdapter.ViewHolder> {

    //    Cursor cursor = null;
    Context context;
    ArrayList<SuperGenreDouble> uniqueGenre;
    private LayoutInflater inflater;
    private ItemClickListener clickListener;


    public DisplayGenresRecyclerViewAdapter(Context context, ArrayList<SuperGenreDouble> uniqueGenre) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.uniqueGenre = uniqueGenre;
    }

    public static String toTitleCase(String givenString) {
        String[] arr = givenString.split(" ");
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < arr.length; i++) {
            sb.append(Character.toUpperCase(arr[i].charAt(0)))
                    .append(arr[i].substring(1)).append(" ");
        }
        return sb.toString().trim();
    }

    public static String removeSpacing(String givenString) {
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < givenString.length(); i++) {
            if (!givenString.contains(" ")) {
                sb.append(givenString.charAt(i));
            }
        }

        return sb.toString().trim();
    }

    public static int getDominantColor(Bitmap bitmap) {
        Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 1, 1, true);
        final int color = newBitmap.getPixel(0, 0);
        newBitmap.recycle();
        return color;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.display_super_genres_recycle_view_container, parent, false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {


        String path;
        String genreRight = uniqueGenre.get(position).superGenre1;
        String imageArtistRight = uniqueGenre.get(position).superGenreImageUrl1;
        String genreLeft = uniqueGenre.get(position).superGenre2;
        String imageArtistLeft = uniqueGenre.get(position).superGenreImageUrl2;

        if (genreLeft != null) {
            holder.textViewLeft.setText(toTitleCase(genreLeft));
            try {
                // get the image
                Picasso.get().load(imageArtistLeft).into(holder.imageGenreLeft, new com.squareup.picasso.Callback() {
                    @Override
                    public void onSuccess() {
                        // set the color
                        Bitmap bitmap = ((BitmapDrawable) holder.imageGenreLeft.getDrawable()).getBitmap();
                        int color = getDominantColor(bitmap);
                        holder.cardColourLeft.setBackgroundColor(color);
                        holder.textViewLeft.setTextColor(lightenColor(color));
                    }

                    @Override
                    public void onError(Exception e) {

                    }

                });


            } catch (Exception e) {

            }

        }
        if (genreRight != null) {
            holder.textViewRight.setText(toTitleCase(genreRight));
            try {
                // get the image
                Picasso.get().load(imageArtistRight).into(holder.imageGenreRight, new com.squareup.picasso.Callback() {
                    @Override
                    public void onSuccess() {
                        // set the color
                        Bitmap bitmap = ((BitmapDrawable) holder.imageGenreRight.getDrawable()).getBitmap();
                        int color = getDominantColor(bitmap);
                        holder.cardColourRight.setBackgroundColor(color);
                        holder.textViewRight.setTextColor(lightenColor(color));
                    }

                    @Override
                    public void onError(Exception e) {

                    }

                });


            } catch (Exception e) {

            }


        }


    }

    @ColorInt
    int lightenColor(@ColorInt int color) {
        return Color.rgb(255-(color >> 8)&0xFF, 255-(color >> 8)&0xFF, 255-(color >> 8)&0xFF);
    }


    @Override
    public int getItemCount() {

        return uniqueGenre.size();

    }

    void setClickListener(ItemClickListener itemClickListener) {
        Log.d("onBindViewHolder", "onBindViewHolder: length");
        this.clickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }



    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView textViewLeft;
        TextView textViewRight;
        ImageView imageGenreLeft;
        ImageView imageGenreRight;
        CardView cardColourRight;
        CardView cardColourLeft;

        ViewHolder(View itemView) {
            super(itemView);
            textViewLeft = itemView.findViewById(R.id.textViewLeft);
            textViewRight = itemView.findViewById(R.id.textViewRight);

            imageGenreLeft = itemView.findViewById(R.id.imageGenreLeft);
            imageGenreRight = itemView.findViewById(R.id.imageGenreRight);

            cardColourRight = itemView.findViewById(R.id.cardViewRight);
            cardColourLeft = itemView.findViewById(R.id.cardViewLeft);

            itemView.setOnClickListener(this);
            

        }


        @Override
        public void onClick(View view) {


            Log.d("myPos", getAdapterPosition());



        }
    }
}


最佳答案

RecyclerView 中获取位置时,您必须注意,您获取的是 ViewHolder 的位置,而不是 View Elements 中的位置。 ViewHolder。因此,对于您的问题,您可以做的就是为您想要的 View 实现 onClickListener :

ViewHolder(View itemView) {
cardColourRight = itemView.findViewById(R.id.cardViewRight);
cardColourLeft = itemView.findViewById(R.id.cardViewLeft);
//add these
cardColourRight.setOnClickListener(this);
cardColourLeft.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    if(view == R.id.cardViewLeft){
        //User has clicked Left
    }
    else if(view == R.id.cardViewRight){
        //User has clicked Right
    }
}

关于java - 如何确定在 recyclerview 布局上单击了哪个卡片 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65968912/

相关文章:

android - Json对象多数组解析、改造

java - 以编程方式从 XSD 文件创建特定 XML 元素

java - 通过 RMI 保持相同的线程名称

android - Lint 错误 : Suspicious equality check: equals() is not implemented in Object DiffUtilEquals

android - fragment 的内容被复制到另一个 fragment

android - RecyclerView - 通过 bool 值控制项目计数

java - 创建 ListView 后查看持有者警告

android - 可扩展 ListView android中的不同 subview

java - 在ant中设置SonarQube的JDK路径

java - HTTP 请求不起作用,使用 setRequestProperty 方法设置授权