简体   繁体   English

片段中的RecyclerView

[英]RecyclerView in Fragment

I am setting up a RecyclerView inside a Fragment following the Android docs example here . 我将按照此处的Android文档示例 Fragment设置RecyclerView

I pasted my code below, there is not much. 我在下面粘贴了我的代码,没有太多。 (The only difference is I'm using a Fragment instead of an Activity). (唯一的区别是我使用的是片段而不是活动)。

The error I'm getting is: 我得到的错误是:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

All solutions to this problem online are to add false argument in layout inflation for fragment. 在线解决这个问题的所有方法都是在布局膨胀中为片段添加false论点。 But I've already done this, and I still get the error. 但是我已经做到了,但仍然出现错误。

My code: 我的代码:

MainActivity 主要活动

...
mFragmentManager = getSupportFragmentManager();
mFragmentTransaction = mFragmentManager.beginTransaction();
mFragmentTransaction.replace(R.id.containerView,new NewsFragment()).commit();
...

NewsFragment 新闻片段

public class NewsFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v =  inflater.inflate(R.layout.news_layout,container, false);

        mRecyclerView = (RecyclerView) v.findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new NewsAdapter(new String[]{"hello","world","qwert","test","greg","peck"});
        mRecyclerView.setAdapter(mAdapter);

        return v;

    }
}

NewsAdapter 新闻适配器

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
    private String[] mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;

        public ViewHolder(TextView tv) {
            super(tv);
            mTextView = tv;
        }
    }

    public NewsAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public NewsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.news_item, parent, false);

        TextView tv = (TextView)v.findViewById(R.id.textView2);
        ViewHolder vh = new ViewHolder(tv);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

Any help would be hugely appreciated! 任何帮助将不胜感激!

The error is on this line: 错误在此行上:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(tv);

Change it to: 更改为:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(v);

The text view is already having a parent. 文本视图已经有一个父级。 That's why you are getting this error. 这就是为什么您会收到此错误。

Updated code: 更新的代码:

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
    private String[] mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;

        public ViewHolder(View view) {
            super(tv);
           mTextView= (TextView)view.findViewById(R.id.textView2);
        }
    }

    public NewsAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public NewsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.news_item, parent, false);


        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM