ViewPager中嵌套recyclerView,应用崩溃

Android 码拜 8年前 (2017-04-22) 2904次浏览
本人写了个应用,想用recyclerViewr和VIewPager实现,原理是在ViewPager中的fragment里嵌套一个recyclerView,但是卡在了recyclerView.getManager的位置,总是显示recyclerView得到一个null Object。
本人的MainActivity的代码如下:

public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPage;
    private MainPagerAdapter mPagerAdapter;
    private ChatPageFragment mChatPage = new ChatPageFragment();
    private MusicGroundFragment mMusicGround = new MusicGroundFragment();
    private ContactPageFragment mContactPage = new ContactPageFragment();
    private RecyclerView mChatRecycleView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //一些无关代码
        initView();
    }
    private void initView(){
        mViewPage = (ViewPager) findViewById(R.id.main_view_pager);
        //mChatRecycleView = (RecyclerView) findViewById(R.id.chat_list_view);
        FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
        ft.add(R.id.main_view_pager,mChatPage);
        ft.add(R.id.main_view_pager,mMusicGround);
        ft.add(R.id.main_view_pager,mContactPage);
        ft.commit();
        mChatRecycleView = mChatPage.getRecycleView();
        mChatRecycleView.setLayoutManager(new LinearLayoutManager(this));
       mChatRecycleView.setAdapter(new ChatPageAdapter(this));
        ArrayList<Fragment> fragments = new ArrayList<>();
        fragments.add(mChatPage);
        fragments.add(mMusicGround);
        fragments.add(mContactPage);
        mPagerAdapter = new MainPagerAdapter(fragments);
        mViewPage.setAdapter(mPagerAdapter);
    }
//一些自动生成的代码
}

本人的activity_main的代码如下:

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.f1993xuboss.musicpark.MainActivity">
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        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:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_view_pager">
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" >
            <ImageSwitcher
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/chat_title_view"
                android:layout_marginLeft="0dp"/>
            <ImageSwitcher
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/contact_title_view"
                android:layout_marginRight="0dp"/>
        </android.support.v4.view.PagerTitleStrip>
    </android.support.v4.view.ViewPager>
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>

本人的ChatPageFragment的代码如下:

public class ChatPageFragment extends Fragment {
    private RecyclerView recyclerView;
    public RecyclerView getRecycleView(){return recyclerView;}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.chat_list_view,container,false);
        this.recyclerView = (RecyclerView) view.findViewById(R.id.chat_list_view);
        return view;
    }
}

本人的chat_list_view的代码如下:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/chat_list_view">
</android.support.v7.widget.RecyclerView>

可能没什么关系,本人的ChatPageAdapter的代码如下:

public class ChatPageAdapter extends RecyclerView.Adapter<ChatPageAdapter.ChatItemViewHolder> {
    private Context mContext;
    public ChatPageAdapter(Context context){
        this.mContext = context;
    }
    @Override
    public ChatItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item,parent,false);
        return new ChatItemViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ChatItemViewHolder holder, int position) {
        //TODO:add holder behavior to adjust the data from the internet
    }
    @Override
    public int getItemCount() {
        return 3;
    }
    class ChatItemViewHolder extends RecyclerView.ViewHolder {
        ImageView mImageView;
        TextView mPersonName;
        TextView mChatContext;
        TextView mData;
        public ChatItemViewHolder(View itemView) {
            super(itemView);
            mImageView = (ImageView) itemView.findViewById(R.id.chat_item_person);
            mPersonName = (TextView) itemView.findViewById(R.id.chat_item_person_name);
            mChatContext = (TextView) itemView.findViewById(R.id.chat_item_context);
            mData = (TextView) itemView.findViewById(R.id.chat_item_data);
        }
    }
}

本人的log如下:
FATAL EXCEPTION: main
Process: com.f1993xuboss.musicpark, PID: 2633
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.f1993xuboss.musicpark/com.f1993xuboss.musicpark.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method “void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)” on a null object reference

at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method “void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)” on a null object reference
at com.f1993xuboss.musicpark.MainActivity.initView(MainActivity.java:64)
at com.f1993xuboss.musicpark.MainActivity.onCreate(MainActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
本人试了一下,网上说的常规方法是findViewById的方法不行,原因是本人activity_main.xml中没包含,所以本人想在fragment函数中获取,但是屡试屡败,高手们有什么解决方法吗?或换个思路也行。

解决方案

10

萌新,,你的注释太少了

30

mChatRecycleView = mChatPage.getRecycleView();有问题

60

在fragment里

        mChatRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
       mChatRecycleView.setAdapter(new ChatPageAdapter(getActivity()

));


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明ViewPager中嵌套recyclerView,应用崩溃
喜欢 (0)
[1034331897@qq.com]
分享 (0)