为什么我的RecyclerView在这个片段中没有显示任何内容?

时间:2017-06-29 02:13:12

标签: java android json android-fragments retrofit2

我使用ViewPager设置了一个非常简单的模板应用程序,只是为了熟悉Fragments和ViewPager本身。我有一个TabbedActivity类,它包含以下片段类:

public static class LinearFragment extends Fragment {

    RecyclerView recyclerView;
    public ArrayList<AndroidVersion> data;
    public DataAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.fragment_linear, container, false);
        recyclerView = (RecyclerView) rootView.findViewById(R.id.card_recyler_view_pager);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        loadJSON();

        return inflater.inflate(R.layout.fragment_linear, container, false);
    }

    private void loadJSON() {
        Retrofit retrofit = MainActivity.getRestAdapter();
        RequestInterface request = retrofit.create(RequestInterface.class);
        Call<JSONResponse> call = request.getJSON();
        call.enqueue(new Callback<JSONResponse>() {
            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {
                JSONResponse jsonResponse = response.body();
                data = new ArrayList<>(Arrays.asList(jsonResponse.getAndroid()));
                adapter = new DataAdapter(data);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onFailure(Call<JSONResponse> call, Throwable t) {
                Log.d("Error", t.getMessage());
            }
        });
    }

}

我的MainActivity是另一个非常基本的文件,用于显示从另一个RecyclerView中的Retrofit返回的一些JSON数据,因此我在MainActivity中构建了一个公共静态方法,以便我可以在整个过程中共享一个Retrofit实例。在我的MainActivity中,JSON被加载并在RecylerView中显示得很好,但出于某种原因,当我导航到ViewPager和LinearFragment部分时没有任何反应。

我的MainActivity中的

getRestAdapter()如下所示:

public static Retrofit getRestAdapter(){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.learn2crack.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    return retrofit;
}

父活动(TabbedActivity)和Fragment的布局文件如下:

activity_tabbed.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.inta.anthony.recylerjsonparsing.TabbedActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/appbar_padding_top"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />


</android.support.design.widget.CoordinatorLayout>

fragment_linear.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.inta.anthony.recylerjsonparsing.MainActivity">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/card_recyler_view_pager"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/view_pager_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/mainActivityButton"/>

</LinearLayout>

谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 每次尝试更新数据时都不要创建适配器。例如,在回收器初始化中的onCreateView()方法中设置它。 要更新数据,您可以在适配器中使用它:

    public void updateItems(ArrayList<AndroidVersion> newItems) {
         if(this.items != null) {
             this.items.clear()
             this.items.addAll(newItems)
             notifyDataSetChanged()
         }
    } 
    
  2. 尝试在测试布局中为回收器视图设置静态高度

答案 1 :(得分:1)

想出来。犯了一个愚蠢的错误,并在片段中return inflater.inflate(R.layout.fragment_linear, container, false);方法的末尾调用了onCreateView()而不是return rootView; rootView对象已经在方法的开头创建了。 / p>