Как получить значение от адаптера к действию в событии клика элемента повторного просмотра в Android? - PullRequest
0 голосов
/ 27 марта 2020

Я изучаю 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();
    }
}

теперь с самой деятельностью:

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

Каким кодом я могу заменить вопросительные знаки в приведенном выше намерении, чтобы фактически получить id от interface : OnBookListener, который реализован в упражнении. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Предполагая, что вы хотите передать идентификатор следующему действию, и предполагая, что следующая строка извлекает нужный вам идентификатор

onBookListener.onBookClick((String)id_textView.getText());

Затем идентификатор является вашим параметром, так что вам просто нужно сделать это

intent.putExtra("id", id);
0 голосов
/ 27 марта 2020

Создать этот класс

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) {

        }
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...