我正在开发一个简单的记事本应用程序,首先我使用listView来显示所有笔记。但现在我使用RecyclerView。当我使用列表视图时,我使用 OnItemClickListener 将数据传递到另一个活动以编辑注释 现在我很困惑在 Recylerview 做什么
对于 listView 我正在使用这个
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();
}
现在我应该为回收视图做什么,请帮忙
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);
}
您可以使用两种方法来处理这个问题
1)。手势触摸 https://www.google.co.in/amp/sapandiwakar.in/recycler-view-item-click-handler/amp/
2).使用适配器中的接口 https://antonioleiva.com/recyclerview-listener/
我建议使用界面的第二种方式
如何使用回收项目的界面click
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;
}
现在将点击分配给界面
@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
//............//
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClick.onItemClick(position);
}
});
}
在适配器类的末尾,从完成括号开始,创建一种方法将 itemclick 分配给界面
public void setOnClick(OnItemClicked onClick){
this.onClick=onClick;
}
在MainActivity.java中 用适配器绑定item click
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
}
}
最简单的解决方案是访问holder类的“itemView”公共变量并在其上设置onClickListener。
@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);
}
});
}
将适配器更改为此
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);
}
}
现在在从活动或片段初始化时将 ItemClickInterface 传递给适配器构造函数。 而不是:
RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames);
使用这个:
RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames, new RecycleViewAdapter.OnItemClicked () {
@Override
public void onItemClick(View view, Position position) {
}
});
首先将此类添加到您的包中
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
}}
然后像这样添加OnItemTouchListener:
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
}
}));
将此代码添加到您的
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);
}
并将您的 Activity/Fragment 实现为 RecyclerViewAdapter.OnItemClicked
要通过 Intent 传递,您可以在 Activity/Fragment 中编写以下代码
@Override
public void onItemClick(int position) {
Intent intent = new Intent(mContext, YourActivity.class);
intent.putExtra(YourActivity.ARG_FILE, filnames.get(position));
startActivity(intent);
}
所以,不确定是否有人感兴趣或者我的方法是否有问题,但我想出了一个更简单的方法供我个人使用。
商品的Xml:
<?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>
在 onBindViewHolder 内部,将标签设置为您需要的任何信息。名称、位置、显示的文字、显示的图片等等。
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.recycText.setText(lstAllInfo.get(position));
holder.recycText.setTag(lstAllInfo.get(position));
}
在您想要处理该项目的方法中,单击:
public void recycClick(View v) {
String test = v.getTag().toString();
Toast.makeText(getApplicationContext(), ("You clicked: " + test), Toast.LENGTH_LONG).show();
}
我认为这有其局限性。标记可能无法保存您需要的数据,或者回收视图可能无法访问单击时的正确活动。就我个人而言,我将它用于 Android Wear,效果很好,所以我想发布以防万一,因为它比其他方法要少很多工作。
将此代码尝试到您的持有者类中...... 它将工作并且易于使用:
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
public ItemHolder(@NonNull final View recyclerView) {
super(recyclerView)
recyclerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
}
});
}
}
在您的适配器类上创建一个接口。
public interface SelectedUser{
void selectedUser(UserModel userModel);
}
在您的适配器视图持有者类中监听单击事件。
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectedUser.selectedUser(userModelList.get(getAdapterPosition()));
}
});
最终在您的活动中实现您的接口并覆盖该方法。
@Override
public void selectedUser(UserModel userModel) {
startActivity(new Intent(MainActivity.this, SelectedUserActivity.class).putExtra("data",userModel));
}
完整教程和源代码使用下面的链接。 带有点击监听器的Recyclerview