简体   繁体   English

如何在Android中的recyclerview项目点击事件中从适配器获取活动的价值?

[英]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.

相关问题 如何从Android中的RecyclerView适配器获取项目 - How to get item from RecyclerView adapter in Android Android中从适配器到活动或片段的Click事件 - Click event from Adapter to Activity or Fragment in Android 如何从另一个 Activity 获取 Recyclerview-Adapter 的值并将值设置为特定位置的 Recyclerview - How to get value to Recyclerview-Adapter from another Activity and set value to Recyclerview of particular position 如何从适配器获取变量值到android kotlin recyclerview中的活动? - How to get the variable value from adapter to activities in android kotlin recyclerview? 从适配器的主要活动中从gridview的子项获取单击事件 - Get click event from gridview's child item in main activity from adapter 如何获取Activity按钮单击RecyclerView.Adapter类中的侦听器 - How to get Activity button click listener in RecyclerView.Adapter class 从活动中删除RecyclerView适配器项 - Remove RecyclerView adapter item from Activity 在活动中从edittext中获取一个值并将其设置为recyclerview适配器 - Get a value from edittext at activity and set it to recyclerview adapter 如何从位置适配器 RecyclerView 获取价值 - How to get value from position adapter RecyclerView 如何在自定义适配器列表视图中同时获取行选择事件和项目单击事件 - How to get row selection event and item click event in custom adapter listview all together in Android
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM