java– 从另一个片段重置RecyclerView适配器

java– 从另一个片段重置RecyclerView适配器,第1张

概述我有一个包含RecyclerView的Fragment.我正在尝试在RecyclerView上实现过滤器.过滤器UI将打开一个新的片段对话框,用户将在其中输入值.一旦用户点击片段对话框中的搜索按钮,该值应返回到RecyclerView片段,并且应清除视图中的现有数据.我想用我将从服务器获取的新数据集重新填充Recyc

我有一个包含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适配器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1118413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存