У меня есть приложение с recyclervView, которое получает данные из базы данных SQLite с помощью курсора. Теперь я хочу передать эти данные другому виду деятельности, когда мы нажимаем на элемент. Можно передать данные с курсором?
И получить идентификатор строки для идентификации данных в базе данных?
Второй вопрос, какое решение лучше для метода itemOnClick? Где я использую этот метод (в классе viewHolder? Или в onBindValue?)
Что мне нужно положить в метод putExtra? Мой курсор?
Мой код адаптера и держателя указан ниже, если это может помочь:
public class GroceryAdapter extends RecyclerView.Adapter<GroceryAdapter.GroceryViewHolder> implements View.OnClickListener {
private Context mContext;
private Cursor mCursor;
int id;
public GroceryAdapter(Context context,Cursor cursor){
mContext = context;
mCursor = cursor;
}
@Override
public void onClick(View v) {
}
public class GroceryViewHolder extends RecyclerView.ViewHolder{
public TextView dateItem, colorItem, textItem;
public ToggleButton lucidItem;
public GroceryViewHolder(final View itemView) {
super(itemView);
dateItem = itemView.findViewById(R.id.date_item);
colorItem = itemView.findViewById(R.id.color_item);
textItem = itemView.findViewById(R.id.text_item);
lucidItem = itemView.findViewById(R.id.lucid_item);
}
}
@NonNull
@Override
public GroceryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.grocery_item, parent, false);
return new GroceryViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
if(!mCursor.moveToPosition(position)){
return;
}
final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));
holder.dateItem.setText(date);
holder.colorItem.setBackgroundColor(color);
holder.textItem.setText(text);
if(lucide == 1){
holder.lucidItem.setVisibility(View.VISIBLE);
}
}
@Override
public int getItemCount() {
return mCursor.getCount();
}
public void swapCursor(Cursor newCursor){
if(mCursor != null){
mCursor.close();
}
mCursor = newCursor;
if(newCursor != null){
notifyDataSetChanged();
}
}
}
Моя модель данных:
книжка общедоступного класса {
public Carnet(){
super();
}
private int id;
private String text;
private String userId;
private int color;
private String method;
private String date;
private int lucid;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getText(){
return text;
}
public void setText(String text){
this.text = text;
}
public int getLucid(){
return lucid;
}
public void setLucid(int lucid){
this.lucid = lucid;
}
public void setMethod(String method){
this.method = method;
}
public String getMethod(){
return method;
}
public void setDate(String date){
this.date = date;
}
public String getDate(){
return date;
}
public void setColor(int color){
this.color = color;
}
public int getColor(){
return color;
}
}
Я видел Parcelable, но я не знаю, как его использовать и в чем особенность этого.
EDIT
Я пытался поймать свое намерение в новом действии, но приложение зависло.
Я получил эту ошибку:
ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное
Процесс: morpheus.oniri, PID: 6696
java.lang.RuntimeException: Невозможно начать деятельность
ComponentInfo {morpheus.oniri / morpheus.oniri.activities.afficherCarnetActivity}:
java.lang.NullPointerException: попытка вызвать виртуальный метод
'boolean java.lang.String.isEmpty ()' для ссылки на пустой объект
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2325)
на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387)
на android.app.ActivityThread.access $ 800 (ActivityThread.java:151)
на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303)
на android.os.Handler.dispatchMessage (Handler.java:102)
на android.os.Looper.loop (Looper.java:135)
на android.app.ActivityThread.main (ActivityThread.java:5254)
в java.lang.reflect.Method.invoke (родной метод)
в java.lang.reflect.Method.invoke (Method.java:372)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698)
Вызывается: java.lang.NullPointerException: попытка вызвать виртуальный метод
'boolean java.lang.String.isEmpty ()' для ссылки на пустой объект
at morpheus.oniri.activities.afficherCarnetActivity.getAllData (afficherCarnetActivity.java:113)
at morpheus.oniri.activities.afficherCarnetActivity.onCreate (afficherCarnetActivity.java:107)
на android.app.Activity.performCreate (Activity.java:5990)
на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1106)
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2278)
на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387)на android.app.ActivityThread.access $ 800 (ActivityThread.java:151)
на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303)
на android.os.Handler.dispatchMessage (Handler.java:102)
на android.os.Looper.loop (Looper.java:135)
на android.app.ActivityThread.main (ActivityThread.java:5254)
в java.lang.reflect.Method.invoke (родной метод)
в java.lang.reflect.Method.invoke (Method.java:372)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698)
Я сделал это в onCreate ().
Intent i = getIntent();
Carnet carnetP;
carnetP = i.getParcelableExtra("data");
notes = carnetP.getText();
Ошибка в этой строке, в моем методе getAllData () вызывается в onCreate ()
if(!notes.isEmpty()){
dream.setVisibility(View.VISIBLE);
getDream.setChecked(true);
getDream.setBackgroundResource(R.color.colorLog);
} else{
dream.setVisibility(View.GONE);
getDream.setChecked(false);
getDream.setBackgroundResource(R.color.colorText);
}
Фактически, когда я делаю Log.d (), моя строковая переменная "notes" равна нулю, но если я делаю Log.d () на "carnetP", я получаю это
morpheus.oniri.model.Carnet@14dbb242
И это не то, что хранится в моей базе данных.
Я сделал свой putExtra на клик, как это
открытый класс GroceryViewHolder расширяет RecyclerView.ViewHolder реализует View.OnClickListener {
public TextView dateItem, colorItem, textItem;
public ToggleButton lucidItem;
public GroceryViewHolder(final View itemView) {
super(itemView);
dateItem = itemView.findViewById(R.id.date_item);
colorItem = itemView.findViewById(R.id.color_item);
textItem = itemView.findViewById(R.id.text_item);
lucidItem = itemView.findViewById(R.id.lucid_item);
itemView.setOnClickListener(this); //my itemView clik
}
@Override
public void onClick(View v) {
int pos = getAdapterPosition();
if(pos != RecyclerView.NO_POSITION){
Intent intent = new Intent(mContext, afficherCarnetActivity.class);
intent.putExtra("data", new Carnet());
mContext.startActivity(intent);
}
}
}