我使用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>
谢谢!
答案 0 :(得分:1)
每次尝试更新数据时都不要创建适配器。例如,在回收器初始化中的onCreateView()方法中设置它。 要更新数据,您可以在适配器中使用它:
public void updateItems(ArrayList<AndroidVersion> newItems) {
if(this.items != null) {
this.items.clear()
this.items.addAll(newItems)
notifyDataSetChanged()
}
}
尝试在测试布局中为回收器视图设置静态高度
答案 1 :(得分:1)
想出来。犯了一个愚蠢的错误,并在片段中return inflater.inflate(R.layout.fragment_linear, container, false);
方法的末尾调用了onCreateView()
而不是return rootView;
rootView
对象已经在方法的开头创建了。 / p>