2017-09-20 8 views
2

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で作業していることを確認したいと思っていました。

答えて

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(); 
} 
+0

それは静的配列リストです。私は、メソッドから取得したDataBaseHub配列リストが静的なものであることを意味します –

+0

リストを変更できる静的なアダプタを持つことはお勧めできません。毎回新しいarrayAdapterを宣言できるような作業がありますが、それはベストプラクティスとは言えません。これがあなたを助けているのかどうかはわかりませんが、私に教えてください! –

0

私はあなたの問題はあなたに

MainView.baseHub.getProductArrayList(); 

リターンArrayListの別のインスタンスなので、あなたはそれがまだアダプタのArrayListに存在している新しいのArrayListから項目を削除することだと思います。

アダプターに渡されたArrayListからアイテムを削除する必要があります。

それ以外の場合は、新しいアダプタを作成し、それをListviewに割り当てます。それは私が問題を前面に来ては、あなたのフラグメントの表示の更新を無効にすることDialogFragmentによるものだと思う

UPDATE

ビューのレクリエーションを強制する必要があります。 DialogFragment内ではなく、フラグメント内からnotifyDatasetChangeを呼び出すようにしてください。例えば、あなたはブール値を設定することができ、フラグメントのonResumeには、ビューを更新しなければならない場合にそのブール値でチェックすることができ、その場合notifyDatasetChangeを呼び出すことができます

+0

アダプターに使用されているarraylist全体が静的です。つまり、アイテムが正しく削除されていれば、フラグメントのリストビューが更新されていないため、アイテムは表示されますが、 –

+0

新しいアダプタを作成してそれをリストビューに割り当てようとしましたか?時々助けます – firegloves

+0

私はすでに既存のものを更新することによってそれをやっているので、新しいものを作成することはリストビューを更新しません –

関連する問題