【问题标题】:I cant fill the recyclerview in fragment from activity我无法在活动的片段中填充 recyclerview
【发布时间】: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


【解决方案1】:

您必须为片段创建实例方法。

    public static SearchPostFragment  newInstance(String key,String content) {
    SearchPostFragment searchFragment = new SearchPostFragment();
    Bundle args = new Bundle();
    args.putString("key_1", key);
    args.putString("key_2", content);
    searchFragment.setArguments(args);
    return searchFragment;

}

在片段调用方法的 OnCreate 方法中,如下所示。

OnCreate(){

   //Write those things below of your recycler view initialization

    String key  = getArguments().getInt("key_1","");
    String content  = getArguments().getInt("key_2", "");
    searchPost(key, content);


}

从这样的活动中调用片段:-

SearchPostFragment.newInstance(key,content);

【讨论】:

    【解决方案2】:

    您遇到的错误是因为片段视图尚未膨胀。您应该考虑通过参数传递这些数据。

    在您的活动中

    SearchPostFragment fragment = new SearchPostFragment();
    Bundle bundle = new Bundle();
    bundle.putString("key", key);
    bundle.putString("content", content);
    fragment.setArguments(bundle);
    // then do the fragment transaction
    

    SearchFragment.java

    public class SearchPostFragment extends Fragment {
    
        RecyclerView recyclerView;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_layout, container, false);
            // replace fragment_layout with your fragment view
        }
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            recyclerView = view.findViewById(R.id.recycler_view);
            // replace recycler_view with your view id
    
            Bundle args = getArguments();
            if (args != null) {
                String key = args.getString("key");
                String content = args.getString("content");
                if (key != null && content != null) {
                    makeApiCall(key, content);
                }
            }
        }
    
        void makeApiCall(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());
                }
            });
        }
    }
    

    【讨论】:

    • 这是我的活动和片段:i.ibb.co/mCy6PS8/photo5951987656600695037.jpg 我正在对活动的 onCreate 方法进行事务处理,所以我只想在输入中输入一些内容,然后调用“makeApiCall 以查看结果”我尝试了您的代码,但是我什么都做不了
    • 您是如何调用makeApiCall 方法的?能否也将该代码添加到问题中?
    • 我从 EditText 的 onKeyListener 调用方法,如果它是你需要的,我添加到问题中
    • 在使用任何视图之前,您需要先扩充片段布局。
    • 我也更新了我的问题。我正在做你对我说的事情,如果我用它的值调用 setTabLayout(String key, String content) 方法,但我想用 EditText onKeyListener() 触发它
    【解决方案3】:

    Recycler 视图的问题当您从其他类调用静态方法时,通常会出现问题,因为最佳解决方案是 您可以实现接口。

    您可以尝试在改造响应中初始化回收站视图。

             try {
    
                    recyclerView=findViewById(R.id.recyclerView);
                    layoutManager=new LinearLayoutManager(context);
                    recyclerView.setLayoutManager(layoutManager);
    
                    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());
                }
    

    【讨论】:

    • 感谢您的回答。我试过了,但我无法通过这种方法获得视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多