我正在添加新的组和子,而在ExpandableListView
中没有问题,但是前一个的子添加新的 group / child 后,> group 总是会更改。
在下面的图片中,我添加了组 = DO ZERO 和 child = 123 。>
现在,当我添加新的组 = CORRECAO FINAL 和 child = 987 时,前一组( DO ZERO )也已更改。
我不知道为什么会这样。
这是我实现对象的方式。
public class ExpandableObjectc {
private String groupName;
private ArrayList<ProductObject> productList;
public ExpandableObjectc(String groupName, ArrayList<ProductObject> productList) {
this.groupName = groupName;
this.productList = productList;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public ArrayList<ProductObject> getProductList() {
return productList;
}
public void setProductList(ArrayList<ProductObject> productList) {
this.productList = productList;
}
}
这是我实现适配器的方式
public class ExpandableAdapterc extends BaseExpandableListAdapter {
private Context context;
private ArrayList<ExpandableObjectc> groupList;
private ArrayList<ExpandableObjectc> groupListFull;
public ArrayList<ExpandableObjectc> getMParent() {
return groupList;
}
public ExpandableAdapterc(Context context, ArrayList<ExpandableObjectc> groupList) {
this.context = context;
this.groupList = groupList;
this.groupListFull = new ArrayList<>(groupList);
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
ArrayList<ProductObject> productList = groupList.get(groupPosition).getProductList();
return productList.size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
ArrayList<ProductObject> productList = groupList.get(groupPosition).getProductList();
return productList.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ExpandableObjectc group = (ExpandableObjectc) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.expandable_group, null);
}
TextView mGroupName = (TextView) convertView.findViewById(R.id.expandable_groupName);
//ImageView mArrow = (ImageView) convertView.findViewById(R.id.expandable_arrow);
mGroupName.setText(group.getGroupName());
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ProductObject product = (ProductObject) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.item_product, null);
}
CircleImageView mImage = (CircleImageView) convertView.findViewById(R.id.item_productImage);
TextView mCode = (TextView) convertView.findViewById(R.id.item_productCode);
TextView mAmount = (TextView) convertView.findViewById(R.id.item_productAmount);
TextView mPrice = (TextView) convertView.findViewById(R.id.item_productPrice);
TextView mDescription = (TextView) convertView.findViewById(R.id.item_productDescription);
ImageButton mProductDelete = (ImageButton) convertView.findViewById(R.id.item_productDelete);
ImageButton mProductEdit = (ImageButton) convertView.findViewById(R.id.item_productEdit);
ToggleButton mFavorite = (ToggleButton) convertView.findViewById(R.id.item_productFavorite);
if (product.getImage() != null) {
byte[] prodIMG = product.getImage();
Bitmap bitmap = BitmapFactory.decodeByteArray(prodIMG,0,prodIMG.length);
mImage.setImageBitmap(bitmap);
//Log.i("debinf prodadapter", "Private Image != null for "+productList.get(position).getDescription());
} else {
mImage.setImageResource(R.drawable.shopping_cart_black_48dp);
}
mCode.setText(product.getCode());
mAmount.setText(product.getAmount());
mPrice.setText(product.getPrice());
mDescription.setText(product.getDescription());
mProductDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeChildFromGroup(groupPosition, childPosition);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public void removeChildFromGroup(int groupPosition, int childPosition) {
ExpandableObjectc group = (ExpandableObjectc) getGroup(groupPosition);
group.getProductList().remove(childPosition);
notifyDataSetChanged();
}
public void filterData(String query) {
query = query.toLowerCase();
groupList.clear();
if (query.isEmpty()) {
groupList.addAll(groupListFull);
} else {
for (ExpandableObjectc group : groupListFull) {
ArrayList<ProductObject> productList = group.getProductList();
ArrayList<ProductObject> newList = new ArrayList<>();
for (ProductObject product : productList) {
if (product.getCode().toLowerCase().contains(query) || product.getDescription().toLowerCase().contains(query)) {
newList.add(product);
}
}
if (newList.size() > 0) {
ExpandableObjectc nGroup = new ExpandableObjectc(group.getGroupName(), newList);
groupList.add(nGroup);
}
}
}
notifyDataSetChanged();
}
}
这是我在MainActivity
中添加新的 group / child 的方式,其中groupName
来自显示的spinner
在上面的第一张图片上。
private void writeProductOnDisk(String groupName) {
boolean isGroup = false;
ProductObject productObject = new ProductObject(imageViewToByte(mProductImage), mCode.getText().toString(), mAmount.getText().toString(), mPrice.getText().toString(), mDescription.getText().toString(),false);
for (int i = 0; i < dataForExpandable.size(); i++) {
if (groupName.equals(dataForExpandable.get(i).getGroupName())) {
dataForExpandable.get(i).getProductList().add(productObject);
isGroup = true;
mProductListAdapter.notifyDataSetChanged();
Log.i("debinf prodact", "groupName already exists "+ groupName);
break;
}
}
if (!isGroup) {
productList.clear();
productList.add(productObject);
dataForExpandable.add(new ExpandableObjectc(groupName,productList));
mProductListAdapter.notifyDataSetChanged();
Log.i("debinf prodact", "groupName DO NOT exists, creating new one "+ groupName);
}
}
我不知道问题是否发生在适配器中,或者何时将新的element
添加到dataForExpandable
变量中。
感谢您的帮助!
编辑
我添加了一个新的 group / child 后添加了一个循环,以打印dataForExpandable
变量中的内容,我发现问题可能出在发生在添加方法dataForExpandable.add(new ExpandableObjectc(groupName,productList));
中,因为它似乎用新的覆盖了先前的组 / 子。
我在groupName
= boa gatolino 中添加的新孩子覆盖了我在groupName
= Grupo Diamante 中放入的所有产品。< / p>
debinf prodact: groupName DO NOT exists, creating new one boa gatolino
debinf prodact: groupName is DO ZERO product is 123
debinf prodact: groupName is CORRECAO FINAL product is 987
debinf prodact: groupName is CORRECAO FINAL product is 111
debinf prodact: groupName is CORRECAO FINAL product is 223
debinf prodact: groupName is CORRECAO FINAL product is 741
debinf prodact: groupName is PARECE QUE AGORA FOI product is 555
debinf prodact: groupName is PARECE QUE AGORA FOI product is 369
debinf prodact: groupName is Grupo Diamante product is 357
debinf prodact: groupName is boa gatolino product is 357
添加新的组 / 子的最佳方法是什么?
答案 0 :(得分:1)
与其将项目添加到 dataForExpandable (活动)/ groupList (适配器),不如将项目添加到 groupListFull (适配器),然后调用filterData()
更新 groupList 。因此,请尝试以下操作:
在适配器内添加以下方法:
public int getBackingListGroupCount() {
return groupListFull.size();
}
public ExpandableObjectc getBackingListGroup(int groupPosition) {
return groupListFull.get(groupPosition);
}
public void addBackingListGroup(ExpandableObjectc group) {
groupListFull.add(group);
}
活动更改:
private void writeProductOnDisk(String groupName) {
boolean isGroup = false;
SearchView searchView = findViewById(R.id.SearchView);
ProductObject productObject = new ProductObject(imageViewToByte(mProductImage), mCode.getText().toString(), mAmount.getText().toString(), mPrice.getText().toString(), mDescription.getText().toString(),false);
for (int i = 0; i < mProductListAdapter.getBackingListGroupCount(); i++) {
if (groupName.equals(mProductListAdapter.getBackingListGroup(i).getGroupName())) {
mProductListAdapter.getBackingListGroup(i).getProductList().add(productObject);
isGroup = true;
mProductListAdapter.filterData(searchView.getQuery().toString());
Log.i("debinf prodact", "groupName already exists "+ groupName);
break;
}
}
if (!isGroup) {
productList = new ArrayList<>();
productList.add(productObject);
mProductListAdapter.addBackingListGroup(new ExpandableObjectc(groupName,productList));
mProductListAdapter.filterData(searchView.getQuery().toString());
Log.i("debinf prodact", "groupName DO NOT exists, creating new one "+ groupName);
}
}
希望有帮助!