【问题标题】:Using RecyclerView with Fragments使用带有片段的 RecyclerView
【发布时间】:2015-02-13 10:44:40
【问题描述】:

我在本教程中使用 CardView 构建了 RecycleView 小部件:

Android L Tutorials (Part 3) - RecyclerView and CardView

现在我试图将其显示为片段。

这是我的 FragmentActivity:

public class FragmentActivity extends Fragment {  
    private RecyclerView mRecyclerView;
    private CountryAdapter mAdapter;
    private LinearLayoutManager layoutManager;
    public FragmentActivity(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.card_layout, container, false);
        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.list);
        layoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter = new CountryAdapter(CountryManager.getInstance().getCountries(), R.layout.card_layout, getActivity());
        return rootView;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
}

MainActivity 我调用我的片段: 公共类 MainActivity 扩展 Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentActivity fragment = new FragmentActivity();
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .add(R.id.container_list, fragment).commit();
}

这是我的 activity_main 布局:

<RelativeLayout 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"
                tools:context=".CountryActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".CountryActivity"
        />
</RelativeLayout>

我的卡片布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_margin="5dp"
    card_view:cardCornerRadius="5dp"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/countryImage"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:scaleType="centerCrop"
            android:tint="@color/photo_tint"
            android:layout_centerInParent="true"
            />

        <TextView
            android:id="@+id/countryName"
            android:gravity="center"
            android:background="?android:selectableItemBackground"
            android:focusable="true"
            android:clickable="true"
            android:layout_width="match_parent"
           android:layout_height="100dp"
           android:textSize="24sp"
           android:layout_centerInParent="true"
           android:textColor="@android:color/white"
           />

    </RelativeLayout>
</android.support.v7.widget.CardView>

和 frame_layout :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:id="@+id/container_list">

</FrameLayout>

应用在调用片段时崩溃。 伙计们,您的帮助将不胜感激。

【问题讨论】:

  • 您应该描述问题所在。您面临的意外行为是什么?
  • 调用fragment时应用崩溃
  • 为什么要使用名称“FragmentActivity”先更改它,因为它已经是基类。这就是为什么 getFragmentManager() 什么也没提供。
  • @kinsell 能否提供应用崩溃时得到的日志?

标签: java android android-fragments android-5.0-lollipop android-recyclerview


【解决方案1】:
public class DemoActivity extends Fragment {  
    private RecyclerView mRecyclerView;
    private CountryAdapter mAdapter;
    private LinearLayoutManager layoutManager;
    public DemoActivity(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.card_layout, container, false);
        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.list);
        layoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(layoutManager);
        mAdapter = new CountryAdapter(CountryManager.getInstance().getCountries(), R.layout.card_layout, getActivity());
        mRecyclerView.setAdapter(mAdapter);
        return rootView;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

请使用此代码,希望对您有所帮助。

【讨论】:

  • 在你发布答案时解释为什么它会起作用,否则它就没有那么有用了。
  • @David 您在制作 Adapter 对象之前已经设置了 Adapter,那时它会获取适配器的 null 对象,这是您的应用程序崩溃的原因。
【解决方案2】:

您在 Fragment 类中夸大了错误的布局

View rootView = inflater.inflate(R.layout.card_layout, container, false);  //Here you are inflating the row layout instad of the fragment

只需更改适当的布局参考

View rootView = inflater.inflate(R.layout. activity_main, container, false);

同样在您的 MainActivity 中将布局资源更改为:

setContentView(R.layout.frame_layout);

【讨论】:

  • 感谢 Carlos 的回答,我已解决此问题,但应用程序仍然崩溃
  • 你遇到了什么异常?
  • E/FragmentManager﹕没有为片段 FragmentActivity{23833986 #0 id=0x7f080042} @Carlos J 这就是我得到的 id 0x7f080042 (com.empire.test01:id/container_list) 找到视图跨度>
  • 好吧,我没有足够的声望点,当我这样做时,我会确保你得到你的点@Carlos J
  • 您是否也更改了 MainActivity 中的布局??
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 2017-03-20
  • 2015-01-09
  • 2015-09-18
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多