Android: handling clicks on ImageViews placed inside RecyclerView

I just switched from ListViewto RecyclerViewand I had a problem: I cannot get ImageView'sonClickListener to work . Basically, I want to display the image in full screen in a new action when the user clicks on it.

Something like that:

enter image description here

What I tried:

@Override
    public PaletteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.card_view, parent, false);

        return new PaletteViewHolder(itemView);

    }
@Override
    public void onBindViewHolder(PaletteViewHolder holder,final int position) {
        Palette palette = palettes.get(position);
        holder.text1.setText(palette.getName());
        holder.text2.setText(palette.getHexValue());
        final Context context = holder.img.getContext();
        Picasso.with(context)
                .load(DaciaData.DaciaModele[position])
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.error)
                .resizeDimen(R.dimen.list_detail_image_size, R.dimen.list_detail_image_size)
                .centerInside()
                .tag(context)
                .into(holder.img);

        holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bundle bundle = new Bundle();
                //add data to your bundle
                bundle.putInt("id", position);
                //create intent
                Intent mainIntent = new Intent(context, Extra1.class);
                //add bundle to intent
                mainIntent.putExtras(bundle);
                //start activity
                context.startActivity(mainIntent);
            }
        });
    }

EDIT

RecyclerItemClickListener:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;

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

    GestureDetector mGestureDetector;

    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildPosition(childView));
            return true;
        }
        return false;
    }

    @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
}

MainRecyclerViewHere I define RecyclerViewalong with onItemTouchListener:

@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerModels);
        LinearLayoutManager linearLM = new LinearLayoutManager(getActivity());
        linearLM.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLM);

        recyclerView.addOnItemTouchListener(                 
                new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        Bundle bundle = new Bundle();
                        bundle.putInt("id", position);

                        Intent i = new Intent(getActivity(), MainViewPager.class);
                        i.putExtras(bundle);
                        startActivity(i);
                    }
                })
        );

Deleting recyclerView.addOnItemTouchListener();will solve the problem with a long click on the image, but I can’t start it ViewPager, I think something is wrong with RecyclerItemClickListener.

+4
source share
5 answers

, . , , recyclerView.addOnItemTouchListener(...);, View.OnClickListener , OnClickListener TextView ImageView, :

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

        protected TextView textView;
        protected ImageView imageView;

        public ContactViewHolder(View v) {
            super(v);
            textView =  (TextView) v.findViewById(R.id.t1);
            imageview = (ImageView)  v.findViewById(R.id.img);

            textView.setOnClickListener(this);
            imageview.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {    

        if (v.getId() == textView.getId()) {
          Toast.makeText(context, "TextView Clicked!", Toast.LENGTH_LONG).show();
        } else if (v.getId() == imageView.getId()) {
          Toast.makeText(context, "ImageView Clicked!", Toast.LENGTH_LONG).show();
        }
    }
+2

, "", , , . ImageView onClickListener .

setTag getTag

 holder.img.setTag(position);
 holder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Integer pos = (Integer)view.getTag(); 
            // returns an object hence the casting

            Bundle bundle = new Bundle();
            //add data to your bundle

            Log.i("Position is",""+pos.intValue);

            bundle.putInt("id", pos.intValue());
            // get int value
            //create intent
            Intent mainIntent = new Intent(context, Extra1.class);
            //add bundle to intent
            mainIntent.putExtras(bundle);
            //start activity
            context.startActivity(mainIntent);
        }
    });

Edit:

pskink, setTag getTag, ViewHolder. .

, getLayoutPosition() RecyclerView

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition%28%29

2:

:

  img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            Log.d(TAG, "Element at " + getLayoutPosition () + " clicked.");

            Bundle bundle = new Bundle();
            //add data to your bundle
            bundle.putInt("id", getLayoutPosition());
            //create intent
            Intent mainIntent = new Intent(context, Extra1.class);
            //add bundle to intent
            mainIntent.putExtras(bundle);
            //start activity
            context.startActivity(mainIntent);
            }
        });

3:

ViewHolder View.OnClickListener

onClick OnClickListener .

0

, . RecyclerView,

  • onItemClick
  • onItemLongClick
  • on

, onClick from view, onItemClick .

, false RecyclerView onItemClick onClick- ViewHolder ( , , ).

false onItemClick RecyclerView

@Override 
public boolean onSingleTapUp(MotionEvent e) {
    return false;
}

onBindViewHolder onClickListener

holder.mainRowLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Handle row item click
    }
});

, , .

0

, :

 Intent i = new Intent(this, ShowActivity.class);
                i.putExtra("filepath", filepath.get(position));
                startActivity(i);

, .

 Bundle b=new Bundle();
 if(b!=null){
     String imagepath=b.getString("filepath");
 }
 Bitmap myBitmap = BitmapFactory.decodeFile(filepath.get(position));
 imageview.setImageBitmap(myBitmap);      
0

:

holder.img.setId(position);
holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bundle bundle = new Bundle();
                //add data to your bundle
                bundle.putInt("id", view.getId());
                //create intent
                Intent mainIntent = new Intent(context, Extra1.class);
                //add bundle to intent
                mainIntent.putExtras(bundle);
                //start activity
                context.startActivity(mainIntent);
            }
        });
-1

All Articles