如何在修改数组后更新列表视图中的项目

时间:2017-09-20 19:25:24

标签: android listview android-fragments

我目前使用自定义数组适配器处理片段中的列表视图,以获取特定产品的名称和数量。问题是,当我在列表视图中有一个项目并想要删除它时,我使用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。

2 个答案:

答案 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