我有一个包含RecyclerVIEw的Fragment.我正在尝试在RecyclerVIEw上实现过滤器.过滤器UI将打开一个新的片段对话框,用户将在其中输入值.一旦用户点击片段对话框中的搜索按钮,该值应返回到RecyclerVIEw片段,并且应清除视图中的现有数据.我想用我将从服务器获取的新数据集重新填充RecyclerVIEw.我的问题是,我在RecyclerVIEw Fragment中有一个名为resetAdapterDetails()的方法,如果从RecyclerVIEw Fragment本身调用,它会按预期工作.但是,当我尝试从Fragment Dialog调用相同的方法时,我得到一个例外:
transactionList.clear(); --> is trying to clear a List which is null
虽然数据在RecyclerVIEw中仍然可见.
RecyclerVIEw片段:
public class TransactionHistoryFragment extends Fragment implements SearchVIEw.OnqueryTextListener, DaterangePickerFragment.OnDaterangeSelectedListener{ private RecyclerVIEw recyclervIEw; private TransactionHistoryAdapter adapter; private List<Transaction> transactionList; public TransactionHistoryFragment() { // required empty public constructor } @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.fragment_transaction_history, container, false); recyclervIEw = (RecyclerVIEw) vIEw.findVIEwByID(R.ID.recyclervIEw); linearlayoutmanager layoutManager = new linearlayoutmanager(getActivity()); recyclervIEw.setLayoutManager(layoutManager); return vIEw; } @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @OverrIDe public voID onVIEwCreated(VIEw vIEw, Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); setHasOptionsMenu(true); getTransactionHistory(""); } @OverrIDe public voID onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.transactions_history_menu, menu); final MenuItem searchItem = menu.findItem(R.ID.action_search); final SearchVIEw searchVIEw = (SearchVIEw) MenuItemCompat.getActionVIEw(searchItem); searchVIEw.setonqueryTextListener(this); super.onCreateOptionsMenu(menu, inflater); } @OverrIDe public boolean onoptionsItemSelected(MenuItem item) { switch (item.getItemID()) { case R.ID.filter_date: FragmentManager fmDate = getActivity().getFragmentManager(); DaterangePickerFragment dialogFragmentDate = DaterangePickerFragment.newInstance(this, true); dialogFragmentDate.show(fmDate, "Sample Fragment"); return true; case R.ID.filter_mobile: FragmentManager fmMobile = getActivity().getFragmentManager(); SearchMobileFragment dialogFragmentMobile = new SearchMobileFragment (); dialogFragmentMobile.show(fmMobile, "Sample Fragment"); //resetAdapterDetails(); return true; default: return super.onoptionsItemSelected(item); } } @OverrIDe public boolean onqueryTextChange(String newText) { final List<Transaction> filteredModelList = filter(transactionList, newText); adapter.setFilter(filteredModelList); return true; } @OverrIDe public boolean onqueryTextsubmit(String query) { return false; } //for filtering the List private List<Transaction> filter(List<Transaction> models, String query) { query = query.tolowerCase();final List<Transaction> filteredModelList = new ArrayList<>(); for (Transaction model : models) { final String text = model.getTxnStatus().tolowerCase(); if (text.contains(query)) { filteredModelList.add(model); } } return filteredModelList; } //for populating the List private voID getTransactionHistory(String agentID){ GetTransactionHistoryTask task = new GetTransactionHistoryTask("agent1", "password"); task.getTransactionsByAgent("OU23","OU230000000123456789").subscribe(transactionHistoryResponse -> { if(transactionHistoryResponse != null && transactionHistoryResponse.getTransactions() != null && transactionHistoryResponse.getTransactions().size() > 0 && transactionHistoryResponse.getErrors().size() == 0){ transactionList = transactionHistoryResponse.getTransactions(); adapter = new TransactionHistoryAdapter(transactionList); recyclervIEw.addItemdecoration(new divIDerItemdecoration(getActivity(), linearlayoutmanager.VERTICAL)); recyclervIEw.setAdapter(adapter); onClickListnerRecyclerVIEw(); } else{ } }, e -> e.printstacktrace()); } private voID onClickListnerRecyclerVIEw() { recyclervIEw.addOnItemtouchListener( new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { @OverrIDe public voID onItemClick(VIEw vIEw, int position) { try { final Transaction transactionModel= (Transaction) adapter.getobjectAt(position); Intent i = new Intent(getActivity(), TransactionDetailsActivity.class); i.putExtra("transaction_object",transactionModel); startActivity(i); } catch (Exception e){ Log.e("List issue", e.toString()); } } }) ); } @OverrIDe public voID onDaterangeSelected(int startDay, int startMonth, int startYear, int endDay, int endMonth, int endYear) { } public voID fetchDaterange(String startDate, String endDate) { Log.e("Daterange",startDate + "\n" + endDate); } public voID fetchMobileNumber(String mobileNumber) { Log.e("Mobile",mobileNumber); resetAdapterDetails(); } public boolean resetAdapterDetails(){ try { transactionList.clear(); adapter.notifyDataSetChanged(); recyclervIEw.setAdapter(adapter); } catch (Exception e) { Log.e("reset Error", ""+e.getMessage()); } return true; }}
对话片段:
public class SearchMobileFragment extends DialogFragment { EditText mMobileNumberEditText; button search_button; public SearchMobileFragment() { // required empty public constructor } @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_search_mobile, container, false); } @OverrIDe public voID onVIEwCreated(VIEw vIEw, Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); mMobileNumberEditText = (EditText) vIEw.findVIEwByID(R.ID.mobile_number_editText); search_button = (button) vIEw.findVIEwByID(R.ID.search_button); search_button.setonClickListener(new VIEw.OnClickListener() { public voID onClick(VIEw v) { dismiss(); TransactionHistoryFragment obj = new TransactionHistoryFragment(); obj.fetchMobileNumber(mMobileNumberEditText.getText().toString()); } }); }}
TransactionHistoryFragment(RecyclerVIEw Fragment)中的fetchMobileNumber()方法是通过fetchMobileNumber()方法调用的,该方法是从SearchMobileFragment(Dialog Fragment)调用的.
我哪里错了?为什么是transactionList.clear();抛出空指针异常?
解决方法:
您收到此问题是因为您在SearchMobileFragment中创建了新的TransactionHistoryFragment实例search_button.这使得它的所有变量都为null并再次初始化它,这里您的transactionList变为null.
您也可以通过不同的方式轻松实现同样的目标.作为SearchogobileFragment作为DialogFragment的位置,您可以将其作为Activity并从TransactionHistoryFragment中将其作为startActivityForResult启动,并实现onActivityResult回调以进行fiteration.
但是现在你可以用不同的方式管理它:
第一种方式:
正如您在DialogFragment中所做的那样
search_button.setonClickListener(new VIEw.OnClickListener() { public voID onClick(VIEw v) { dismiss(); /*TransactionHistoryFragment obj = new TransactionHistoryFragment(); obj.fetchMobileNumber(mMobileNumberEditText.getText().toString());*/ } });
不要在这里调用fetchMobileNumber,在您的TransactionHistoryFragment的onResume中,您应该调用它.在单击search_button时,将过滤器数据保存到SharedPreferences,并在TransactionHistoryFragment的onResume中使用它进行过滤,然后在此片段的SharedPreferences onPause中清除此保存的数据.
你应该删除
transactionList.clear();
来自TransactionHistoryFragment中的resetAdapterDetails()的代码,因为在搜索过滤器之后,您将获得更新的事务列表,该事务列表已经传递给适配器,然后强制不需要清除它.或者在清除它之前进行检查:
if(transactionList!=null){ transactionList.clear();}
第二种方式:使用broadcastReceiver可以实现同样的目的.
在TransactionHistoryFragment中注册一个接收者,从SearchMobileFragment注册sendbroadcast.在onHceive的TransactionHistoryFragment中执行过滤过程.
以上是内存溢出为你收集整理的java – 从另一个片段重置RecyclerView适配器全部内容,希望文章能够帮你解决java – 从另一个片段重置RecyclerView适配器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)