web-dev-qa-db-fra.com

Comment ajouter l'écouteur Onclick à la vue recycleur

Je développe une application simple bloc-notes d'abord, j'ai utilisé listView pour afficher toutes les notes. Mais maintenant, j'utilise RecyclerView. Pendant que j'utilisais listview, j'ai utilisé OnItemClickListener pour transmettre les données à une autre activité afin d'éditer la note.

Pour listView j'utilise ceci

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            name = filenames.get(position).getName();
            note = filenames.get(position).getShorttext();
            Alert(); // this method is in main activity 

        }
    });*/  


  public void Alert()
   {
    final AlertDialog dialog;
    View mview = getLayoutInflater().inflate(R.layout.dialog_pass,null);
    final EditText mEdittext = (EditText) mview.findViewById(R.id.Epass);
    AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
    mBuilder.setView(mview);
    mBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String col = mEdittext.getText().toString();
            String password = dBhelper.searchpass(col);
            if (col.equals(password)) {
                Intent intent =  new Intent(MainActivity.this,Note2.class);
                intent.putExtra("Name",name);
                intent.putExtra("Note",note);
                startActivity(intent);
            } else {
                Toast temp = Toast.makeText(MainActivity.this, "Password does not match", Toast.LENGTH_SHORT);
                temp.show();
            }

        }
    });
    mBuilder.setNegativeButton("Cancel",null);
    mBuilder.setCancelable(false);
    dialog = mBuilder.create();
    dialog.show();

     }

Maintenant, que dois-je faire pour Recycle View Please Help

  public class RecycleViewAdapter extends 
  RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
  private List<FileName> fileNames;
  private Context context;

  public RecycleViewAdapter(Context context,List<FileName> fileNames) {
    this.context = context;
    this.fileNames = fileNames;

}

@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater mInflater = LayoutInflater.from(parent.getContext());

    ViewGroup mainGroup = (ViewGroup) mInflater.inflate(
            R.layout.grid_item, parent, false);
    RecycleViewHolder listHolder = new RecycleViewHolder(mainGroup);
    return listHolder;

}

@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
    final FileName model = fileNames.get(position);
    RecycleViewHolder mainHolder = (RecycleViewHolder) holder;// holder
    mainHolder.title.setText(model.getName());
    mainHolder.note.setText(model.getShorttext());

}

@Override
public int getItemCount() {
    return (null != fileNames ? fileNames.size() : 0);
  }
7
faiz mir

Vous pouvez gérer cela de deux manières

1). Gesture touch https://www.google.co.in/amp/sapandiwakar.in/recycler-view-item-click-handler/amp/

2) .Utilisation de l'interface dans l'adaptateur https://antonioleiva.com/recyclerview-listener/

Je suggère une deuxième manière en utilisant l'interface

Comment utiliser l'interface pour recycleritemclick

public class RecycleViewAdapter extends 
  RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
  private List<FileName> fileNames;
  private Context context;

//declare interface 
 private OnItemClicked onClick;

//make interface like this
    public interface OnItemClicked {
        void onItemClick(int position);
    }

  public RecycleViewAdapter(Context context,List<FileName> fileNames) {
    this.context = context;
    this.fileNames = fileNames;

Maintenant, assignez le clic à l'interface

  @Override
    public void onBindViewHolder(RecycleViewHolder holder, final int position) {
        //............//
        holder.title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemClick(position);
            }
        });

}

À la fin de la classe d’adaptateur, à partir du crochet de finition, définissez une méthode pour affecter itemclick à l’interface.

public void setOnClick(OnItemClicked onClick)
{
    this.onClick=onClick;
}

Dans MainActivity.Java Liez l’élément click avec l’adaptateur

public class MainActivity extends Activity implements OnItemClicked {

    private RecyclerView mRecyclerView;
    private CityAdapter mAdapter;
    private List<City> cities;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city);

        mRecyclerView = (RecyclerView)findViewById(R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mAdapter = new CityAdapter(cities, R.layout.row_city, this);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnClick(MainActivity.this); // Bind the listener
    }

    @Override
    public void onItemClick(int position) {
        // The onClick implementation of the RecyclerView item click
    //ur intent code here
}

J'espère que cela vous aidera si vous avez besoin d'aide, vous pouvez demander

22
Lokesh Desai

La solution la plus simple consisterait à accéder à la variable publique "itemView" de la classe de titulaire et à définir onClickListener à ce sujet. 

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, NewActivity.class);
                intent.putExtra("FileName", list.get(position));
                context.startActivity(intent);
            }
        });        
}
8
Vipul Kumar

Ajoutez d'abord cette classe à votre paquet

public class MyTouchListener implements RecyclerView.OnItemTouchListener {


/*Change these as per your need*/
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private static final int SWIPE_MAX_OFF_PATH = 250;

private OnTouchActionListener mOnTouchActionListener;
private GestureDetectorCompat mGestureDetector;

public static interface OnTouchActionListener {
    public void onLeftSwipe(View view, int position);
    public void onRightSwipe(View view, int position);
    public void onClick(View view, int position);
}

public MyTouchListener(Context context, final RecyclerView recyclerView,
                             OnTouchActionListener onTouchActionListener){

    mOnTouchActionListener = onTouchActionListener;
    mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // Find the item view that was swiped based on the coordinates
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            int childPosition = recyclerView.getChildPosition(child);
            mOnTouchActionListener.onClick(child, childPosition);
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2,
                               float velocityX, float velocityY) {

            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
                    return false;
                }

                // Find the item view that was swiped based on the coordinates
                View child = recyclerView.findChildViewUnder(e1.getX(), e1.getY());
                int childPosition = recyclerView.getChildPosition(child);

                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onLeftSwipe(child, childPosition);
                    }

                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onRightSwipe(child, childPosition);
                    }
                }
            } catch (Exception e) {
                // nothing
            }

            return false;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    mGestureDetector.onTouchEvent(e);
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    // do nothing
}}

Ajoutez alorsOnItemTouchListener comme ceci:

myRecyclerView.addOnItemTouchListener(new MyTouchListener(mContext,
            myRecyclerView,
            new MyTouchListener.OnTouchActionListener() {
                @Override
                public void onLeftSwipe(View view, int position) {//code as per your need
                }

                @Override
                public void onRightSwipe(View view, int position) {//code as per your need
                }

                @Override
                public void onClick(View view, int position) {//code as per your need
                }
            }));
1
Suraj Vaishnav

Changez votre adaptateur pour cela

    public class RecycleViewAdapter extends
        RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
    private List<FileName> fileNames;
    private Context context;
    private OnItemClicked listener;

    public RecycleViewAdapter(Context context, List<FileName> fileNames, OnItemClicked  listener) {
        this.context = context;
        this.fileNames = fileNames;
        this.listener = listener;
    }

    public BookingHistoryFragment() {
        // Required empty public constructor
    }

    @Override
    public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater mInflater = LayoutInflater.from(parent.getContext());

        ViewGroup mainGroup = (ViewGroup) mInflater.inflate(
                R.layout.grid_item, parent, false);
        RecycleViewHolder listHolder = new RecycleViewHolder(mainGroup);

        return listHolder;

    }

    @Override
    public void onBindViewHolder(RecycleViewHolder holder, final int position) {
        final FileName model = fileNames.get(position);
        RecycleViewHolder mainHolder = (RecycleViewHolder) holder;// holder
        mainHolder.title.setText(model.getName());
        mainHolder.note.setText(model.getShorttext());

        // Add click listener for root view
        view.getRootView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            listener.onItemClick(view, position)
        }
        });
    }

    @Override
    public int getItemCount() {
        return (null != fileNames ? fileNames.size() : 0);
    }

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

Passez maintenant ItemClickInterface au constructeur de l’adaptateur lors de l’initialisation à partir d’une activité ou d’un fragment ..__ au lieu de:

RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames);

Utilisez ceci:

RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames, new RecycleViewAdapter.OnItemClicked () {
@Override
      public void onItemClick(View view, Position position) {

      }
});
1
Hammad Akram

Donc, je ne suis pas sûr que quiconque soit intéressé ou s'il y a des problèmes avec ma méthode, mais j'ai mis au point une méthode beaucoup plus simple pour mon usage personnel.

Xml de l'article:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="?android:attr/listPreferredItemHeightLarge"
    Android:background="@drawable/recycborder">


    <TextView
        Android:id="@+id/recycText"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_vertical|center"
        Android:onClick="recycClick"
        Android:textColor="@color/black"
        Android:textSize="16sp" />

</RelativeLayout>

À l'intérieur de onBindViewHolder, définissez la balise égale aux informations dont vous avez besoin. Le nom, la position, le texte affiché, la photo affichée, peu importe.

@Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.recycText.setText(lstAllInfo.get(position));
        holder.recycText.setTag(lstAllInfo.get(position));

    }

Dans votre méthode où vous souhaitez gérer l'élément, cliquez sur:

 public void recycClick(View v) {
        String test = v.getTag().toString();
        Toast.makeText(getApplicationContext(), ("You clicked: "  + test), Toast.LENGTH_LONG).show();
    }

Je suppose qu'il y a des limites à cela. Il se peut que Tag ne puisse pas contenir les données dont vous avez besoin, ou il est possible que la vue de recyclage ne puisse pas accéder à la bonne activité pour le clic sur. Personnellement, je l'utilise pour Android Wear et ça marche très bien, alors j'ai pensé poster au cas où, vu que c'est beaucoup moins de travail que les autres méthodes.

0
user5330423

Ajoutez ce code dans votre adaptateur RecyclerView

    private OnItemClicked mListener;

    public RecycleViewAdapter(Context context, OnItemClicked listener, List<FileName> fileNames) {
        //............//
        this.mListener = listener;
    }

    @Override
    public void onBindViewHolder(RecycleViewHolder holder, final int position) {
        //............//
        mainHolder.title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onItemClick(position);
            }
        });

    }

    public interface OnItemClicked {
        void onItemClick(int position);
    }

Et implémentez votre activité/fragment à RecyclerViewAdapter.OnItemClicked

Pour passer via Intent, vous pouvez écrire ci-dessous le code dans votre activité/fragment

    @Override
    public void onItemClick(int position) {
        Intent intent = new Intent(mContext, YourActivity.class);
        intent.putExtra(YourActivity.ARG_FILE, filnames.get(position));
        startActivity(intent);
    }
0
Krunal Kapadiya