(Немного расширенные вопросы).
У меня есть recyclerview с базой данных Sqlite. На одной карточке recyclerview есть некоторая информация, но если пользователю нужны дополнительные сведения, щелкните ее и откройте новое действие. Проблема в том, как передать информацию из reyclerview в новое действие через Parcelable. (сокращенная версия моего кода):
Edit_Product Activity.class с рециклером:
mAdapter.setOnItemClickListener(new Recycler_Adapter.ClickListener() {
@Override
public void onItemClick(View itemview) {
itemClick((long) itemview.getTag());
}
public void itemClick(long id){
Intent intent = new Intent(this, Product_specific_detail.class);
intent.putExtra("key", getAllItems().getPosition() <-- Where getAllItems() is my Cursor);
startActivity(intent);
}
Item_get_copy.class
public class Item_get_copy implements Parcelable {
public String Name_Product;
public int Amount;
public Item_get_copy(String text1, int mAmount){
Name_Product = text1;
Amount = mAmount;
}
protected Item_get_copy(Parcel in) {
Name_Product = in.readString();
Amount = in.readInt();
}
public static final Creator<Item_get_copy> CREATOR = new Creator<Item_get_copy>() {
@Override
public Item_get_copy createFromParcel(Parcel in) {
return new Item_get_copy(in);
}
@Override
public Item_get_copy[] newArray(int size) {
return new Item_get_copy[size];
}
};
public String getText(){
return Name_Product;
}
public int getmAmount(){
return Amount;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(Name_Product);
dest.writeInt(Amount);
}
}
Product_specifc_details.class
public class Product_specific_detail extends AppCompatActivity {
private TextView product_name;
private TextView amount_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_specific_detail);
product_name = findViewById(R.id.detail_name_pr);
amount_text = findViewById(R.id.detail_amount_pr);
Intent intent = getIntent();
Item_get_copy item_get_copy = intent.getParcelableExtra("key");
String line1 = item_get_copy.getText();
String line2 = item_get_copy.getText();
product_name.setText(line1);
amount_text.setText(line2);
}
}
Recycler_Adapter имеет что-то вроде:
@Override
public void onBindViewHolder(@NonNull recyclerViewHolder holder, int position) {
String product_name = cursor.getString(cursor.getColumnIndex(NAME_PRODUCT));
int amount = cursor.getInt(cursor.getColumnIndex(AMOUNT));
long id = cursor.getLong(cursor.getColumnIndex(_ID));
holder.itemView.setTag(id);
}
У меня много других переменных (короче мой вопрос: осталось только Name_Product с количеством), но даже Name_product я не могу передать, потому что получаю:
java .lang.NullPointerException: попытка вызвать виртуальный метод 'java .lang.String com.example ... Item_get_copy .getText () 'для ссылки на нулевой объект, щелкнув карточку Recyclerview.
3. Вопросы.
Я хочу сделать это так, как будто оно находится в верхней части моего сообщения (с помощью метода itemClick из Edit_Product.class), это возможно?
Или
Вопрос 1. Я должен вызвать намерение из Recycler_Adapter, а не из Edit_Product.class, как сейчас.
Вопрос 2. Следует ли мне добавлять такой код в Recycler_Adapter:
Item_get_copy item_get_copy = new Item_get_copy();
item_get_copy.setText(product_name);
item_get_copy.setInt(amount);
А также в my Item_get_copy добавьте это:
public void String setText(String text){
Name_Product = text;
}
public void int getmAmount(int number){
Amount = number;
Вопрос 3. Я видел много сообщений на разных форумах, люди делают это так:
List <...> mListVariable;
mListVariable = new ArrayList <> ();
Это что нужно? Потому что я читал, что лучшим решением является использование SimpleCursorAdapter. Не записывать данные в ArrayList, а затем переходить к следующему действию, потому что это требует больше времени и памяти. Итак ...
3a) ArrayList необходим?
3b) Нужно ли мне использовать SimpleCursorAdapter, если я использую Recycler_Adapter?
3 c) Как решить мою проблему?