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