问题描述
所以它看起来像这样: SCREENSHOT
但是当我点击添加或减少按钮时,它会返回整个列表的大小。 In this case its returns 2(because the otitles.size() returns 2) 喜欢在我点击的项目下方出现列表中的另一个项目。
PARENT 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() && getimage.movetoNext() && getingridients.movetoFirst() && getdependencies.movetoFirst()
&& getprices.movetoFirst() && getquantities.movetoFirst() && getstartprice.movetoFirst() && getbrand.movetoFirst() && 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() && getimage.movetoNext() && getingridients.movetoNext() && getdependencies.movetoNext()
&& getprices.movetoNext() && getquantities.movetoNext() && getstartprice.movetoNext() && getbrand.movetoNext() && 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 && distance <= 2000) {
holder.delivery.setText("Delivery: 500 AMD");
progressBar.setVisibility(View.INVISIBLE);
} else if (distance > 2000 && distance <= 3000) {
holder.delivery.setText("Delivery: 600 AMD");
} else if (distance > 3000 && 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);
}
}
CHILD 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,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,"");
} 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",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",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);
}
}
}
我怎样才能准确返回 PARENT RecyclerView 发送的(那个位置的)列表的大小?
解决方法
哦...这真的很难读。 我会试着给你一些关于更好架构的技巧。我希望你没事。
- 为什么要使用这么多列表?为什么不使用标题、图像、成分等所有数据制作一份自定义 madr 类列表。
- 为什么将类的类型命名为 recyclercart 而不是 RecyclerCard。在 Kotlin 和 Java 中,程序员没有写出规则应该使用大写字母和驼峰命名法来命名类。
- 另一件事是您使用数据库融合在一起并将数据上传到视图过程中。这不好。最好有其他类,如 DatabaseManager 或类似的东西,这将使从数据库等获取数据的工作成为可能。类将在视图中显示数据。代码将被简化,也许错误会更明显。如果您想动态(在滚动期间)上传子数据,您可以使用 cab,但它的代码也应该放在 DatabaseManager 或 Helper 中。如果数据量不大 - 最好在创建适配器之前上传它甚至只是放置 Map
- 我还会检查使用 SQLiteHelper 的方式。我不确定,但有些东西告诉我你在一个程序中创建了几个数据库。它可能是危险的。请检查一下。记住创建一次数据库,然后连接几次。关于这一点,我不确定。我需要更少的时间来调查您的代码。
关于我的提示:结帐 SOLID;您将拥有更清晰的架构。
,好的,我终于找到了解决方案。这很有趣,但问题是 ArrayLists 是静态的。所以我刚刚删除了 static
字段,现在一切正常。