[英]How to get value from adapter to activity on recyclerview item click event in Android?
I'm learning RecyclerView
and I built an app that can populate simple data from SQLite database
I have an Adapter as follows :-我正在学习
RecyclerView
并且我构建了一个可以从SQLite database
填充简单数据的应用程序我有一个适配器,如下所示:-
public class BookAdapter extends RecyclerView.Adapter<BookAdapter.BookViewHolder> {
Context mContext;
Cursor mCursor;
OnBookListener mOnBookListener;
public int id;
public BookAdapter(Context context, Cursor cursor, OnBookListener onBookListener){
mContext = context;
mCursor = cursor;
mOnBookListener = onBookListener;
}
public class BookViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView id_textView, name_textView;
OnBookListener onBookListener;
public BookViewHolder(@NonNull View itemView, OnBookListener onBookListener) {
super(itemView);
id_textView = itemView.findViewById(R.id.book_id);
name_textView = itemView.findViewById(R.id.book_name);
this.onBookListener = onBookListener;
itemView.setOnClickListener(this);
}
public String getId_textView() {
return (String)id_textView.getText();
}
public String getName_textView() {
return (String)name_textView.getText();
}
@Override
public void onClick(View v) {
onBookListener.onBookClick((String)id_textView.getText());
//Log.d(TAG, "onBookClick : Clicked " + id_textView.getText());
}
}
public interface OnBookListener{
void onBookClick(String id);
}
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.book_item,parent,false);
return new BookViewHolder(view, mOnBookListener);
}
@Override
public void onBindViewHolder(@NonNull BookViewHolder holder, int position) {
if(!mCursor.moveToPosition(position)){
return;
}
id = mCursor.getInt(mCursor.getColumnIndex(Book.BookEntry.COLUMN_ID));
String name = mCursor.getString(mCursor.getColumnIndex(Book.BookEntry.COLUMN_NAME));
holder.id_textView.setText(String.valueOf(id));
holder.name_textView.setText(name);
if(position %2 == 1)
{
holder.itemView.setBackgroundColor(Color.parseColor("#E9EEF3"));
}
else
{
holder.itemView.setBackgroundColor(Color.parseColor("#0FA9E8"));
}
}
@Override
public int getItemCount() {
return mCursor.getCount();
}
public void swapCursor(Cursor newCursor){
if(mCursor != null){
mCursor.close();
}
mCursor = newCursor;
if(newCursor != null){
notifyDataSetChanged();
}
}
now with the Activity itself :现在使用 Activity 本身:
public class MainActivity extends AppCompatActivity implements BookAdapter.OnBookListener {
public SQLiteDatabase mdatabase;
public BookAdapter madapter;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//SqliteDBHelper dbHelper = new SqliteDBHelper(this);
SqliteAssetHelper dbHelper = new SqliteAssetHelper(this);
mdatabase = dbHelper.getReadableDatabase();
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
madapter = new BookAdapter(this, getAllBooks(), this);
recyclerView.setAdapter(madapter);
madapter.swapCursor(getAllBooks());
}
private Cursor getAllBooks(){
return mdatabase.query(Book.BookEntry.TABLE_NAME,null,null,null
,null,null,null);
}
@Override
public void onBookClick(String id) {
Intent intent = new Intent(this, HadithsList.class);
intent.putExtra("id", ???);
startActivity(intent);
}
What code can I replace the question marks in the above intent to actually get the id
from the interface : OnBookListener
That is implemented in the activity.我可以用什么代码替换上面意图中的问号以实际从
interface : OnBookListener
获取id
interface : OnBookListener
是在活动中实现的。 Thanks in advance提前致谢
Assuming you want to pass an id to the next Activity, and assuming the followinf line retrieve the id you want假设您想将 id 传递给下一个 Activity,并假设 followinf 行检索您想要的 id
onBookListener.onBookClick((String)id_textView.getText());
Then, the id is your parameter, so you just have to do this然后,id 是你的参数,所以你只需要这样做
intent.putExtra("id", id);
Create this class创建这个类
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener
{
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
} }
handle onClick处理点击
recyclerView.addOnItemTouchListener(new
RecyclerTouchListener(getApplicationContext(), recyclerView, new
RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
MealListModel model = myList.get(position);
}
@Override
public void onLongClick(View view, int position) {
}
}));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.