#java #android #android-studio #android-recyclerview #recyclerlistview
#java #Android #android-studio #android-recyclerview #recyclerlistview
Вопрос:
Так что это выглядит так: СКРИНШОТ
Но когда я нажимаю кнопку добавить или меньше, она возвращает размер всего списка. В этом случае он возвращает 2 (потому что otitles.size() возвращает 2), Как под элементом, который я щелкнул, появляется другой элемент из списка.
РОДИТЕЛЬСКИЙ адаптер RecyclerView:
public class recyclercart extends RecyclerView.Adapter<recyclercart.myViewHolder> {
Context context;
ArrayList<String> list;
public static View.OnClickListener onclickup;
public static View.OnClickListener onclickdown;
public static ArrayList<String> otitles = new ArrayList<>();
public static ArrayList<String> oimages = new ArrayList<>();
public static ArrayList<String> oingridients = new ArrayList<>();
public static ArrayList<String> odependencies = new ArrayList<>();
public static ArrayList<String> oquantities = new ArrayList<>();
public static ArrayList<String> oprices = new ArrayList<>();
public static ArrayList<String> ostartprices = new ArrayList<>();
public static ArrayList<String> obrand = new ArrayList<>();
public static ArrayList<String> oid = new ArrayList<>();
Cursor gettitle, getimage, getingridients, getdependencies,getquantities, getprices, getstartprice, getbrand, getid;
ArrayList<Integer> postoremove= new ArrayList<>();
ProgressBar progressBar;
SQLiteDatabase database;
public recyclercart(Context c, ProgressBar progressBar){
context=c;
this.progressBar=progressBar;
SQLHelper helper = new SQLHelper(context);
database = helper.getWritableDatabase();
Cursor cursor = database.rawQuery("SELECT * FROM " SQLHelper.DATABASE_TABLE, null);
list =new ArrayList<>();
cursor.moveToFirst();
do {
String lol = cursor.getString(cursor.getColumnIndex(SQLHelper.BRAND_NAME));
list.add(lol.substring(0,lol.length()-5));
}while (cursor.moveToNext());
if(cursor.moveToLast()) {
postoremove.clear();
Log.d("glavniy", "LIST: " list.toString());
list = new ArrayList<>(removeDuplicates(list));
}
}
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.templatecart, parent, false );
return new myViewHolder(view);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position) {
otitles.clear();
oimages.clear();
oingridients.clear();
odependencies.clear();
oprices.clear();
oquantities.clear();
ostartprices.clear();
obrand.clear();
oid.clear();
Cursor cur = database.rawQuery("SELECT " SQLHelper.TITLE_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE " SQLHelper.BRAND_NAME " LIKE '%"
list.get(position) "%'", null);
SQLHelper helper = new SQLHelper(context);
SQLiteDatabase database = helper.getWritableDatabase();
gettitle = database.rawQuery("SELECT " SQLHelper.TITLE_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getimage = database.rawQuery("SELECT " SQLHelper.IMAGESRC_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getingridients = database.rawQuery("SELECT " SQLHelper.INGRIDIENTS_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getdependencies = database.rawQuery("SELECT " SQLHelper.DEPENDENCIES_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getprices = database.rawQuery("SELECT " SQLHelper.PRICE_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getquantities = database.rawQuery("SELECT " SQLHelper.QUANTITY_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getstartprice = database.rawQuery("SELECT " SQLHelper.START_PRICE " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getbrand = database.rawQuery("SELECT " SQLHelper.BRAND_NAME " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
getid = database.rawQuery("SELECT " SQLHelper.KEY_ID " FROM " SQLHelper.DATABASE_TABLE " WHERE "
SQLHelper.BRAND_NAME " LIKE '%" list.get(position) "%'", null);
if (gettitle.moveToFirst() amp;amp; getimage.moveToNext() amp;amp; getingridients.moveToFirst() amp;amp; getdependencies.moveToFirst()
amp;amp; getprices.moveToFirst() amp;amp; getquantities.moveToFirst() amp;amp; getstartprice.moveToFirst() amp;amp; getbrand.moveToFirst() amp;amp; getid.moveToFirst()) {
do {
otitles.add(gettitle.getString(gettitle.getColumnIndex(SQLHelper.TITLE_NAME)));
oimages.add(getimage.getString(getimage.getColumnIndex(SQLHelper.IMAGESRC_NAME)));
oingridients.add(getingridients.getString(getingridients.getColumnIndex(SQLHelper.INGRIDIENTS_NAME)));
odependencies.add(getdependencies.getString(getdependencies.getColumnIndex(SQLHelper.DEPENDENCIES_NAME)));
oprices.add(getprices.getString(getprices.getColumnIndex(SQLHelper.PRICE_NAME)));
oquantities.add(getquantities.getString(getquantities.getColumnIndex(SQLHelper.QUANTITY_NAME)));
ostartprices.add(getstartprice.getString(getstartprice.getColumnIndex(SQLHelper.START_PRICE)));
obrand.add(getbrand.getString(getbrand.getColumnIndex(SQLHelper.BRAND_NAME)));
oid.add(getid.getString(getid.getColumnIndex(SQLHelper.KEY_ID)));
Log.d("glavniy", String.valueOf(ostartprices));
} while (gettitle.moveToNext() amp;amp; getimage.moveToNext() amp;amp; getingridients.moveToNext() amp;amp; getdependencies.moveToNext()
amp;amp; getprices.moveToNext() amp;amp; getquantities.moveToNext() amp;amp; getstartprice.moveToNext() amp;amp; getbrand.moveToNext() amp;amp; getid.moveToNext());
}
if(gettitle.moveToLast()) {
Log.d("glavniy", "MOVETOLAST");
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context));
holder.recyclerView.setAdapter(new recyclerOrdersAdapter(context, otitles, oimages, oingridients, oquantities, oprices, ostartprices
, obrand, odependencies, oid));
}
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("resources");
reference.child(list.get(position)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
holder.title.setText(snapshot.child("nameBrand").getValue().toString());
Glide.with(context).load(snapshot.child("imageBrand").getValue().toString()).into(holder.imageView);
try {
if(recyclerSearchRecycler.timeCheck(snapshot.child("times").child("startTime").getValue().toString(),
snapshot.child("times").child("closeTime").getValue().toString())){
holder.open.setText("OPEN");
}else {holder.open.setText("CLOSED");}
} catch (ParseException e) {
e.printStackTrace();
}
reference.child(list.get(position)).child("addresses").addListenerForSingleValueEvent(new ValueEventListener() {
@SuppressLint("SetTextI18n")
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()){
ArrayList<String> addresses = new ArrayList<>();
addresses.add(dataSnapshot.getValue().toString());
Log.d("glavniy", dataSnapshot.getValue().toString());
if(addresses.size()==snapshot.getChildrenCount()) {
try {
float distance = activityBrandPage.getNearestRest(addresses, context);
Log.d("glavniy", "DIST: " distance);
if (distance <= 1000) {
progressBar.setVisibility(View.INVISIBLE);
holder.delivery.setText("Delivery: 400 AMD");
} else if (distance > 1000 amp;amp; distance <= 2000) {
holder.delivery.setText("Delivery: 500 AMD");
progressBar.setVisibility(View.INVISIBLE);
} else if (distance > 2000 amp;amp; distance <= 3000) {
holder.delivery.setText("Delivery: 600 AMD");
} else if (distance > 3000 amp;amp; distance <= 4000) {
holder.delivery.setText("Delivery: 700 AMD");
progressBar.setVisibility(View.INVISIBLE);
}
if (search.prog != null) {
search.prog.setVisibility(View.INVISIBLE);
}
} catch (IOException e) {
e.printStackTrace();
progressBar.setVisibility(View.VISIBLE);
Toast.makeText(context, "Failed, please restart", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public static class myViewHolder extends RecyclerView.ViewHolder {
TextView title, delivery, open;
ImageView imageView;
public static RecyclerView recyclerView;
public myViewHolder(@NonNull View itemView) {
super(itemView);
imageView=itemView.findViewById(R.id.ivBrandCart);
recyclerView=itemView.findViewById(R.id.recyclerMainCart);
title=itemView.findViewById(R.id.tvBrandCart);
delivery=itemView.findViewById(R.id.tvdelivery);
open=itemView.findViewById(R.id.opentv);
}
}
ДОЧЕРНИЙ адаптер RecyclerView:
public class recyclerOrdersAdapter extends RecyclerView.Adapter<recyclerOrdersAdapter.myViewHolder> {
public static Context context;
SQLiteDatabase database;
public static int pos;
public static ArrayList<String> otitles = new ArrayList<>();
public static ArrayList<String> oimages = new ArrayList<>();
public static ArrayList<String> oingridients = new ArrayList<>();
public static ArrayList<String> odependencies = new ArrayList<>();
public static ArrayList<String> oquantities = new ArrayList<>();
public static ArrayList<String> oprices = new ArrayList<>();
public static ArrayList<String> ostartprices = new ArrayList<>();
public static ArrayList<String> obrand = new ArrayList<>();
public static ArrayList<String> oids = new ArrayList<>();
@SuppressLint("Recycle")
public recyclerOrdersAdapter(Context c, ArrayList<String> titles, ArrayList<String> images, ArrayList<String> ingridients,
ArrayList<String> quantities, ArrayList<String> prices, ArrayList<String> startprices, ArrayList<String> brands,
@Nullable ArrayList<String> dependencies, ArrayList<String> ids){
System.out.println("hi");
otitles=new ArrayList<>(titles);
oimages= new ArrayList<>(images);
oingridients=new ArrayList<>(ingridients);
oquantities=new ArrayList<>(quantities);
oprices=new ArrayList<>(prices);
ostartprices=new ArrayList<>(startprices);
obrand=new ArrayList<>(brands);
oids=new ArrayList<>(ids);
assert dependencies != null;
odependencies=new ArrayList<>(dependencies);
context = c;
}
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.templateorders, parent, false );
return new myViewHolder(view);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position) {
System.out.println("hello n");
if(obrand.size()!=0) {
String title = otitles.get(position);
String image = oimages.get(position);
String ingridient = oingridients.get(position);
String dependencie = odependencies.get(position);
String priceik = oprices.get(position);
String quanik = oquantities.get(position);
ingridient = ingridient.replaceAll("[^a-zA-Z0-9, ]", "");
if (ingridient.contains("null, ")) {
ingridient = ingridient.replaceAll("null, ", "");
} else if (ingridient.contains("null,")) {
ingridient = ingridient.replaceAll("null,", "");
} else {
ingridient = ingridient.replaceAll("null", "");
}
dependencie = dependencie.replaceAll("[^a-zA-Z0-9, ]", "");
System.out.println("ingridients " ingridient);
holder.title.setText(title);
Glide.with(context).load(image).placeholder(R.drawable.elipsis).into(holder.imageView);
holder.ingridients.setText(ingridient);
if(odependencies.get(position)!=null) {
holder.dependencies.setText(dependencie);
}
if(!priceik.contains("$")) {
holder.price.setText(priceik "$");
}else {
holder.price.setText(priceik);
}
holder.quantity.setText(quanik);
holder.startprice.setText(ostartprices.get(position));
holder.id.setText(oids.get(position));
SQLHelper helper = new SQLHelper(context);
database = helper.getWritableDatabase();
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("glavniy", "TITLE: " holder.title.getText().toString());
Log.d("glavniy", "position is" String.valueOf(position));
SQLHelper helper = new SQLHelper(context);
SQLiteDatabase database = helper.getWritableDatabase();
database.execSQL("DELETE FROM " SQLHelper.DATABASE_TABLE " WHERE (" SQLHelper.KEY_ID
"='" holder.id.getText().toString() "')");
notifyItemRemoved(position);
Log.d("glavniy", DatabaseUtils.dumpCursorToString(database.rawQuery("SELECT * FROM " SQLHelper.DATABASE_TABLE, null)));
}
});
holder.up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("glavniy", "TITLE: " holder.title.getText().toString());
int o = Integer.parseInt(holder.quantity.getText().toString()) 1;
holder.quantity.setText(String.valueOf(o));
int o1 = Integer.parseInt(holder.startprice.getText().toString()) * Integer.parseInt(holder.quantity.getText().toString());
holder.price.setText(o1 "$");
Log.d("glavniy", "UPDATED");
database.execSQL("UPDATE " SQLHelper.DATABASE_TABLE " SET " SQLHelper.QUANTITY_NAME "='" holder.quantity.getText() "' WHERE ("
SQLHelper.KEY_ID "='" holder.id.getText() "')");
database.execSQL("UPDATE " SQLHelper.DATABASE_TABLE " SET " SQLHelper.PRICE_NAME "='" holder.price.getText() "' WHERE ("
SQLHelper.KEY_ID "='" holder.id.getText() "')");
Log.d("glavniy", DatabaseUtils.dumpCursorToString(database.rawQuery("SELECT * FROM " SQLHelper.DATABASE_TABLE, null)));
}
});
holder.down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Integer.parseInt(holder.quantity.getText().toString()) != 1) {
holder.quantity.setText(String.valueOf(Integer.parseInt(holder.quantity.getText().toString())-1));
int o1 = Integer.parseInt(holder.price.getText().toString().replace("$","")) - Integer.parseInt(holder.startprice.getText().toString());
holder.price.setText(o1 "$");
database.execSQL("UPDATE " SQLHelper.DATABASE_TABLE " SET " SQLHelper.QUANTITY_NAME "='" holder.quantity.getText() "' WHERE ("
SQLHelper.KEY_ID "='" holder.id.getText() "')");
database.execSQL("UPDATE " SQLHelper.DATABASE_TABLE " SET " SQLHelper.PRICE_NAME "='" holder.price.getText() "' WHERE ("
SQLHelper.KEY_ID "='" holder.id.getText() "')");
Log.d("glavniy", DatabaseUtils.dumpCursorToString(database.rawQuery("SELECT * FROM " SQLHelper.DATABASE_TABLE, null)));
}
}
});
}
}
@Override
public int getItemCount() {
return otitles.size();
}
@SuppressLint("StaticFieldLeak")
public class myViewHolder extends RecyclerView.ViewHolder {
public TextView title, price, ingridients, dependencies, up,down, quantity, startprice, id;
public ImageView imageView;
public ImageView delete;
public myViewHolder(@NonNull View itemView) {
super(itemView);
id=itemView.findViewById(R.id.textView7);
startprice=itemView.findViewById(R.id.textView6);
quantity = itemView.findViewById(R.id.ordersQuanity);
up=itemView.findViewById(R.id.upBtn);
down=itemView.findViewById(R.id.downBtn);
delete=itemView.findViewById(R.id.removeButton);
title = itemView.findViewById(R.id.titleOfOrder);
price = itemView.findViewById(R.id.priceOfOrder);
imageView=itemView.findViewById(R.id.imageOfOrde);
ingridients = itemView.findViewById(R.id.ingridientsOfOrder);
dependencies = itemView.findViewById(R.id.dependenciesOfOrder);
}
}
}
Как я могу заставить возвращать точный размер списка, который отправляет РОДИТЕЛЬСКИЙ RecyclerView (этой позиции)?
Ответ №1:
Ох… Это действительно трудно читать. Я постараюсь дать вам несколько советов по улучшению архитектуры. Надеюсь, у вас все в порядке.
- Почему вы используете так много списков? Почему вы не создаете один список пользовательских классов madr со всеми данными, такими как заголовок, изображение, itp ингредиента.
- Почему вы называете тип класса recyclercart вместо RecyclerCard. В Kotlin и в Java программисты не написали правило, что классы должны называться с большой буквы, а в camelCase устаревшими.
- Другое дело, что вы объединились, используя базу данных и загружая данные в процессы просмотра. Это нехорошо. Было бы лучше иметь другой класс, такой как DatabaseManager или что-то в этом роде, который выполнит работу по извлечению данных из базы данных и т.д. Если вы это сделаете, ваш RecyclerViewAdapter получит список готовых элементов в конструкторе, и единственной обязанностью этого класса будет отображать данные в представлениях. Код будет упрощен, и, возможно, ошибка будет более заметной. Если вы хотите динамически загружать дочерние данные (во время прокрутки), вы вызываете cab, но код для него также должен быть размещен в DatabaseManager или Helper . Если количество данных невелико — было бы лучше загрузить его до того, как адаптер будет создан, и просто вместо этого поместить Map<Item,List .
- Я бы также проверил способ использования SQLiteHelper. Я не уверен, но что-то подсказывает мне, что вы создаете несколько баз данных в одной программе. Это может быть опасно. Пожалуйста, просто проверьте это. Не забудьте создать базу данных один раз и просто подключиться к ней несколько раз. Насчет этого я не уверен. У меня меньше времени на изучение вашего кода.
О моих советах: проверьте SOLID; у вас будет намного более понятная архитектура.
Комментарии:
1. Большое спасибо за советы.
Ответ №2:
Хорошо, наконец, я нашел решение. Это довольно забавно, но проблема заключалась в том, что списки массивов были статическими. Итак, я просто удалил static
поле, и теперь все работает нормально.