【发布时间】:2019-08-14 01:31:25
【问题描述】:
我正在从 ActivityA 获取数据并尝试访问 fragment 方法来填充 RecyclerView。
在Activity中设置TabLayout方法;
private void setTabLayout(String key, String content) {
//Create Fragment
SearchPostFragment fragment = new SearchPostFragment();
Bundle bundle = new Bundle();
bundle.putString("key", key);
bundle.putString("content", content);
fragment.setArguments(bundle);
//init
tabLayout = findViewById(R.id.search_activity_tab);
viewPager = findViewById(R.id.search_activity_container);
adapter = new SettingsViewAdapter(getSupportFragmentManager());
//Add Fragments
adapter.addFragment(fragment, getString(R.string.activity_search_tablayout_post_title));
adapter.addFragment(new SearchUserFragment(), getString(R.string.activity_search_tablayout_user_title));
//Setup Adapter
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
我在我的Activity onCreate()上使用这个Set Up TabLayout方法来设置,首先给null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setTabLayout(null, null);
}
然后我从 EditText 键侦听器调用 fragment 方法;
searchET.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
//Pressed Enter
String searchText = searchET.getText().toString();
if (!searchText.trim().equals("")){
switch (tabLayout.getSelectedTabPosition()){
case 0: //Post
SearchPostFragment fragment = new SearchPostFragment();
fragment.searchPost(key, content);
break;
case 1: //User
break;
}
}
return true;
}
return false;
}
});
Fragment方法看起来像;
public void searchPost(String key, String content) {
Call<SearchResponse> call = RetrofitClient.getInstance().getApi().getSearch(key, content);
call.enqueue(new Callback<SearchResponse>() {
@Override
public void onResponse(Call<SearchResponse> call, Response<SearchResponse> response) {
try {
if (!response.body().isError()) {
searchList = response.body().getSearch();
adapter = new SearchPostAdapter(getActivity(), searchList);
recyclerView.setAdapter(adapter);
}
} catch (NullPointerException e) {
Log.d(TAG, "onResponse: " + e.getMessage());
}
}
@Override
public void onFailure(Call<SearchResponse> call, Throwable t) {
Log.d(TAG, "onFailure: " + t.getMessage());
}
});
}
我得到了;
onResponse: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
但如果我在我的 fragment 中调用该 method,就像在 onViewCreated 中一样,一切都会顺利进行。 我尝试发送 context 或在 onAttach 中获取上下文,但这些都不起作用
我正在使用 Tab Layout 结构。
我的应用看起来像 https://i.ibb.co/mCy6PS8/photo5951987656600695037.jpg
如果您需要,我可以为您提供更多信息
我解决了这个问题;
EditText OnKeyListener
Fragment searchPostFragment = (SearchPostFragment)getSupportFragmentManager().getFragments().get(0);
((SearchPostFragment) searchPostFragment).searchPost(key, content);
感谢您的帮助
【问题讨论】:
-
recyclerView 对象为空,这就是发生异常的原因。
标签: java android android-fragments android-recyclerview android-viewpager