RecyclerView崩溃的应用程序(由于新的设计库?)

时间:2016-02-17 01:01:13

标签: android android-recyclerview parent-child material-design recycler-adapter

我试图使用列表填充我的RecyclerView,我的应用程序崩溃了错误"这个孩子已经有了父母"。 现在我认为它可能与新的android工作室和新的设计库有关。

我在RecyclerView适配器上调用inflate方法时尝试了false和true参数

这是我的代码:

的活动:

RecyclerView usersRecyclerView = (RecyclerView) findViewById(R.id.users_recyclerView);
usersAdapter = new UsersAdapter(appUsers);
usersRecyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
usersRecyclerView.setLayoutManager(mLayoutManager);
usersRecyclerView.setAdapter(usersAdapter);

activity.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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.sarigbrand.japanesequickcourse.ChatActivity">

    <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>

    <include layout="@layout/content_chat" />

    <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"
        android:src="@android:drawable/ic_dialog_email" />

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

content_chat.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.sarigbrand.japanesequickcourse.ChatActivity"
    tools:showIn="@layout/activity_chat"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/heb_loading"
        android:id="@+id/loading_textView"
        android:textColor="@color/colorRed500"
        android:layout_gravity="center_horizontal"
        android:textStyle="bold"
        android:layout_marginTop="16dp"/>

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

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

UsersAdapter:

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserHolder> {

    ArrayList<AppUser> appUsers;

    public UsersAdapter (ArrayList<AppUser> appUsers){
        this.appUsers = appUsers;
    }

    public static class UserHolder extends RecyclerView.ViewHolder {
        public TextView userNameTV;
        public UserHolder(TextView tv) {
            super(tv);
            userNameTV = tv;
        }
    }

    @Override
    public UsersAdapter.UserHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_user_list_view, parent, false);
        TextView tv = (TextView) v.findViewById(R.id.user_name_textView);
        UserHolder userHolder = new UserHolder(tv);
        return userHolder;
    }

    @Override
    public void onBindViewHolder(UserHolder holder, int position) {
        AppUser user = appUsers.get(position);
        holder.userNameTV.setText(user.userName);
    }


    @Override
    public int getItemCount() {
        return appUsers.size();
    }
}

错误日志:

FATAL EXCEPTION: main Process: com.example.sarigbrand.japanesequickcourse, PID: 8642
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4309)
at android.view.ViewGroup.addView(ViewGroup.java:4145)
at android.view.ViewGroup.addView(ViewGroup.java:4086)
at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:585)
at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:6254)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:6212)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:6200)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1384)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.vie

2 个答案:

答案 0 :(得分:1)

您正在给视图充气,但之后只将其中一个子视图存储在您的持有者中:

@Override
public UsersAdapter.UserHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_user_list_view, parent, false);
    TextView tv = (TextView) v.findViewById(R.id.user_name_textView);
    // Make a holder that takes v in the constructor.
    UserHolder userHolder = new UserHolder(tv);
    return userHolder;
}

应使用ROOT视图实例化ViewHolder,该视图表示要显示的整个项目。在你的情况下,那应该是“v”。这是在滚动时添加和删除到RecyclerView的内容。然后,您可以在其中选择其他视图并将其存储为成员,以便快速轻松地访问。

答案 1 :(得分:0)

正如Doug Stevenson所解释的那样,我夸大了一个视图,但只通过了文本视图。 这是更改后的代码

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserHolder> {

    ArrayList<AppUser> appUsers;

    public UsersAdapter (ArrayList<AppUser> appUsers){
        this.appUsers = appUsers;
    }

    public static class UserHolder extends RecyclerView.ViewHolder {
        public LinearLayout linearLayout;
        public TextView textView;
        public UserHolder(LinearLayout layout, TextView tv) {
            super(layout);
            linearLayout = layout;
            textView = tv;
        }
    }

    @Override
    public UsersAdapter.UserHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LinearLayout layout = (LinearLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_user_list_view, parent, false);
        TextView tv = (TextView) layout.findViewById(R.id.user_name_textView);
        UserHolder userHolder = new UserHolder(layout, tv);
        return userHolder;
    }

    @Override
    public void onBindViewHolder(UserHolder holder, int position) {
        AppUser user = appUsers.get(position);
        holder.textView.setText(user.userName);
    }

    @Override
    public int getItemCount() {
        return appUsers.size();
    }
}