Androidで家計簿アプリをJavaで作成しています。
ここでやりたい事は、下記ProductFragmentの検索結果が表示されるListViewをDelete/Updateした後のListViewの更新です。
一連の動きは下記の通りです。
1.ProductFragmentでSEARCHボタンを押す
2.検索結果がListViewに表示される。
3.表示されたListView上のアイテムを1つクリックする。
4.別のアクティビティ(NewBudgetTracker)へ移動し、アイテムをDelete・Updateする。
5.Delete・Update後は元のProductFragmentへ戻る。
問題は上記5以降です。
最初に述べた通り、検索結果のアイテムをDelete・Updateすると、DB上のデータはDelete・Updateされるのですが、
ListViewが更新されず、Deleteされたはずのアイテムが残り続けていたり、Updateされず古い情報が残り続けています。
そのため、ProductFragmentで下記処理を追加し、再度SELECT文を発行する処理(getProductTypeLists)を行ってします。
最後に「productListViewAdapter.notifyDataSetChanged();」でAdapterを更新する処理を追加しているのですが、ListViewは更新されませんでした。
viewModelProductNameLists = budgetTrackerViewModel.getProductTypeLists(productType); ProductListViewAdapter productListViewAdapter; productListViewAdapter = new ProductListViewAdapter(getActivity(), viewModelProductNameLists); productListViewAdapter.notifyDataSetChanged(); productListView.setAdapter(productListViewAdapter);
大変お手数ですが、解決の為、ご助力頂けますと幸いです。
よろしくお願いいたします。
NewBudgetTracker画面(Delete/Update実行)
ProductFragment.java
package com.myproject.offlinebudgettrackerappproject; <省略> /** * A simple {@link Fragment} subclass. * Use the {@link ProductFragment#newInstance} factory method to * create an instance of this fragment. */ public class ProductFragment extends Fragment { private static final int RESULT_OK = -1; BudgetTrackerViewModel budgetTrackerViewModel; private ProductListViewAdapter productListViewAdapter; public static final String PRODUCT_FRAGMENT_ID = "product_fragment_id"; private ListView productListView; private List<BudgetTracker> budgetTrackerList; private List<BudgetTracker> budgetTracker; List<BudgetTracker> viewModelProductNameLists; ActivityMainBinding activityMainBinding; private int newBudgetTrackerIntentId = 0; String productType; // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public ProductFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment ProductFragment. */ // TODO: Rename and change types and number of parameters public static ProductFragment newInstance(String param1, String param2) { ProductFragment fragment = new ProductFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_product, container, false); EditText enterProductTypeForQuery = (EditText) view.findViewById(R.id.product_search_txt); Button productSearchQueryBtn = (Button) view.findViewById(R.id.btn_product_search); productListView = (ListView) view.findViewById(R.id.product_listview); TextView productTypeSum = (TextView) view.findViewById(R.id.product_type_sum_result_txt); activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater()); BaseAdapter adapter = new StoreListViewAdapter(getActivity(), budgetTrackerList); productListViewAdapter = new ProductListViewAdapter(getActivity(), 1); productListView.setAdapter(productListViewAdapter); productSearchQueryBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { BudgetTracker budgetTracker; // 2022/02/11 追加 ProductListViewAdapter productListViewAdapter; productType = enterProductTypeForQuery.getText().toString(); budgetTrackerViewModel = new ViewModelProvider(requireActivity()).get(BudgetTrackerViewModel.class); budgetTracker = new BudgetTracker(); budgetTracker.setProductType(productType); viewModelProductNameLists = budgetTrackerViewModel.getProductTypeLists(productType); productListViewAdapter = new ProductListViewAdapter(getActivity(), viewModelProductNameLists); productListView.setAdapter(productListViewAdapter); String productTypeSumStr = String.valueOf(budgetTrackerViewModel.getProductTypeSum(productType)); productTypeSum.setText(productTypeSumStr); // Todo 2022/04/10 Tapped modified productListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { String date = adapterView.getItemAtPosition(position).toString(); List<BudgetTracker> budgetListItems = viewModelProductNameLists; int intId = (int) id; BudgetTracker productItemId = budgetListItems.get(intId); Intent productFragmentIntent = new Intent(getActivity(), NewBudgetTracker.class); productFragmentIntent.putExtra(PRODUCT_FRAGMENT_ID, productItemId.getId()); startActivityForResult(productFragmentIntent, 1); } }); Log.d("TAG", "onClick: " + enterProductTypeForQuery.getText().toString()); } }); return view; } @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == RESULT_OK) { int result = data.getIntExtra("result", 0); viewModelProductNameLists = budgetTrackerViewModel.getProductTypeLists(productType); productListViewAdapter = new ProductListViewAdapter(getActivity(), viewModelProductNameLists); productListView.setAdapter(productListViewAdapter); } } } }
NewBudgetTracker.java
if (shopFragmentIntentId != 0) { setResult(RESULT_OK, shopFragmentGetIntent); } else if (productFragmentIntentId != 0) { setResult(RESULT_OK, productFragmentGetIntent); } else if (dateFragmentIntentId != 0) { setResult(RESULT_OK, dateFragmentGetIntent); }

回答1件
あなたの回答
tips
プレビュー