我目前使用自定义数组适配器处理片段中的列表视图,以获取特定产品的名称和数量。问题是,当我在列表视图中有一个项目并想要删除它时,我使用OnItemLongClickListener来显示一个警告对话框,要求确认。之后,如果用户确认了操作,我会从数据库中删除该值,然后从数组列表中删除它。
这里的交易每当我从列表中删除项目时,它会一直显示片段,它只会在我离开当前页面后更新;该项目不存在,您无法与之互动,但它仍然可见。
我从Db和数组中删除项目后使用notifyDataSetChanged函数。
以下是代码:
Alert.Dialog:
public class DeleteDialog extends DialogFragment {
static int deleteSelected;
static CustomArrayAdapter arrayAdapter;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(R.drawable.warning_image)
.setTitle("Eliminar")
.setMessage("¿Confirmar eliminación?")
.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
deleteStockDialog(deleteSelected);
arrayAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dismiss();
}
});
return builder.create();
}
public static void setDeleteSelected(int i) {
deleteSelected = i;
}
public static void setArrayAdapter(CustomArrayAdapter adapter){
arrayAdapter=adapter;
}
public void deleteStockDialog(int selected) {
ArrayList<Product> arrayProduct = DataBaseHub.getProductArrayList();
Product newProduct = arrayProduct.get(selected);
arrayProduct.remove(selected);
MainView.dbHandler.deleteProduct(newProduct.getProductName());
}
}
这里是带有列表视图的片段
public class StockPage extends Fragment {
private CustomArrayAdapter adapter;
private ArrayList<Product> arrayProduct;
private ListView listView;
private AddStockDialog addStockDialog;
private DeleteDialog deleteDialog;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
arrayProduct = MainView.baseHub.getProductArrayList();
int layout;
if (arrayProduct.isEmpty()) {
layout = R.layout.empty_view;
} else {
layout = R.layout.stock_fragment;
}
View view = inflater.inflate(layout, container, false);
if (layout == R.layout.stock_fragment) {
//not empty
listView = view.findViewById(R.id.listView_Stock);
adapter = new CustomArrayAdapter(getContext(), arrayProduct);
listView.setAdapter(adapter);
dialogOnClick();
dialogOnLongClick();
} else {
//empty
listView = view.findViewById(R.layout.empty_view);
}
return view;
}
private void dialogOnClick() {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
addStockDialog = new AddStockDialog();
AddStockDialog.setAddSelected(position);
addStockDialog.show(getFragmentManager(), "Añadir");
//add to sell or stock
}
});
}
private void dialogOnLongClick() {
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
deleteDialog = new DeleteDialog();
DeleteDialog.setDeleteSelected(position);
DeleteDialog.setArrayAdapter(adapter);
deleteDialog.show(getFragmentManager(), "Eliminar");
//delete addStockDialog
return true;
}
});
}
奖金问题,我尝试使用listView.setEmptyView,但什么也没做,所以我不得不使用你在上面看到的条件。
我想要的是,每当我删除一个项目时,listview会以某种方式刷新并仅显示活动项目或空白屏幕(如果没有剩下的话)。 提前谢谢。
**编辑:使用的arraylist是静态的,我想确保我总是使用相同的arrayList。
答案 0 :(得分:1)
您也必须将其从适配器中删除。
public void deleteStockDialog(int selected) {
ArrayList<Product> arrayProduct = DataBaseHub.getProductArrayList();
Product newProduct = arrayProduct.get(selected);
arrayProduct.remove(selected);
arrayAdapter.remove(newProduct);
MainView.dbHandler.deleteProduct(newProduct.getProductName());
arrayAdapter.notifyDataSetChanged();
}
答案 1 :(得分:0)
我认为你的问题是
MainView.baseHub.getProductArrayList();
返回另一个ArrayList
实例,因此当您从新的ArrayList中删除该项时,它仍然存在于适配器的ArrayList
中。
您必须从传递给适配器的ArrayList中删除您的项目。
否则创建一个新适配器并将其分配给Listview。它应该强制重新创建视图
<强>更新强>
我认为问题是由于前景中的DialogFragment禁用了片段的视图更新。尝试从片段内部调用notifyDatasetChange,而不是在DialogFragment内部。例如,您可以设置一个布尔值,并且在片段的onResume中,如果必须更新视图,则可以使用该布尔值进行检查,在这种情况下,请调用notifyDatasetChange