Imは現在、特定の製品の名前と量を取得するためにカスタムアレイアダプタを使用しているフラグメントのリストビューで作業しています。問題は、リストビューにアイテムがあり、それを削除したいときに、OnItemLongClickListenerを使用して確認を求める警告ダイアログを表示することです。その後、ユーザーがアクションを確認した場合、データベースから値を削除した後、配列リストからその値を削除します。アレイを変更した後にリストビューでアイテムを更新する方法
リストからアイテムを削除するたびに、フラグメントをint型にして表示します。現在のページを終了すると更新されます。アイテムはそこにありません、あなたはそれと対話することはできませんが、それはまだ見えています。
私は、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、何もしなかったので、私は上に表示されている条件を使用しなければなりませんでした。
アイテムを削除するたびにリストビューが更新され、何も残っていなければアクティブなアイテムまたは空白のスクリーンだけが表示されます。 ありがとうございます。
**編集:使用されるarraylistは静的なので、私は常に同じarrayListで作業していることを確認したいと思っていました。
それは静的配列リストです。私は、メソッドから取得したDataBaseHub配列リストが静的なものであることを意味します –
リストを変更できる静的なアダプタを持つことはお勧めできません。毎回新しいarrayAdapterを宣言できるような作業がありますが、それはベストプラクティスとは言えません。これがあなたを助けているのかどうかはわかりませんが、私に教えてください! –