Java 片段中的回收视图

Java 片段中的回收视图,java,android,android-fragments,android-recyclerview,Java,Android,Android Fragments,Android Recyclerview,我正在一个Fragment内设置一个RecyclerView,以Android文档为例 我把代码贴在下面,没有太多。(唯一的区别是我使用的是片段而不是活动) 我得到的错误是: java.lang.IllegalStateException:指定的子级已具有父级。必须首先对孩子的家长调用removeView()。 在线解决此问题的所有方法都是在fragment的布局膨胀中添加false参数。但我已经这样做了,我仍然得到错误 我的代码: main活动 ... mFragmentManager = g

我正在一个
Fragment
内设置一个
RecyclerView
,以Android文档为例

我把代码贴在下面,没有太多。(唯一的区别是我使用的是片段而不是活动)

我得到的错误是:

java.lang.IllegalStateException:指定的子级已具有父级。必须首先对孩子的家长调用removeView()。

在线解决此问题的所有方法都是在fragment的布局膨胀中添加
false
参数。但我已经这样做了,我仍然得到错误

我的代码:

main活动

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

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;

    }
}
新闻适配器

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;
    }
}
公共类NewsAdapter扩展了RecyclerView.Adapter{ 私有字符串[]mDataset; 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图mTextView; 公共取景器(TextView tv){ 超级(电视); mTextView=tv; } } 公共新闻适配器(字符串[]myDataset){ mDataset=myDataset; } @凌驾 public NewsAdapter.ViewHolder onCreateViewHolder(视图组父级、, int视图类型){ 视图v=LayoutInflater.from(parent.getContext()) .充气(R.layout.news\u项,父项,假); TextView tv=(TextView)v.findViewById(R.id.textView2); ViewHolder vh=新的ViewHolder(电视); 返回vh; } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ holder.mTextView.setText(mDataset[position]); } @凌驾 public int getItemCount(){ 返回mDataset.length; } }
任何帮助都将不胜感激

错误在这一行:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(tv);
将其更改为:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(v);
文本视图已具有父视图。这就是为什么会出现这个错误

更新代码:

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;
    }
}
公共类NewsAdapter扩展了RecyclerView.Adapter{ 私有字符串[]mDataset; 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图mTextView; 公共视图持有者(视图){ 超级(电视); mTextView=(TextView)view.findViewById(R.id.textView2); } } 公共新闻适配器(字符串[]myDataset){ mDataset=myDataset; } @凌驾 public NewsAdapter.ViewHolder onCreateViewHolder(视图组父级、, int视图类型){ 视图v=LayoutInflater.from(parent.getContext()) .充气(R.layout.news\u项,父项,假); 视窗支架vh=新视窗支架(v); 返回vh; } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ holder.mTextView.setText(mDataset[position]); } @凌驾 public int getItemCount(){ 返回mDataset.length; } }
错误在这一行:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(tv);
将其更改为:

TextView tv = (TextView)v.findViewById(R.id.textView2);
ViewHolder vh = new ViewHolder(v);
文本视图已具有父视图。这就是为什么会出现这个错误

更新代码:

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;
    }
}
公共类NewsAdapter扩展了RecyclerView.Adapter{ 私有字符串[]mDataset; 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图mTextView; 公共视图持有者(视图){ 超级(电视); mTextView=(TextView)view.findViewById(R.id.textView2); } } 公共新闻适配器(字符串[]myDataset){ mDataset=myDataset; } @凌驾 public NewsAdapter.ViewHolder onCreateViewHolder(视图组父级、, int视图类型){ 视图v=LayoutInflater.from(parent.getContext()) .充气(R.layout.news\u项,父项,假); 视窗支架vh=新视窗支架(v); 返回vh; } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ holder.mTextView.setText(mDataset[position]); } @凌驾 public int getItemCount(){ 返回mDataset.length; } }
在哪一行抛出异常??没有直接引用代码中的特定行。。。错误与此完全相同:您需要使用断点进行调试,查看哪个视图的附加操作正在抛出异常在哪一行抛出异常??在我的代码中没有对特定行的直接引用。。。错误与此完全相同:您需要使用断点进行调试,查看哪个视图的附加操作引发异常,但是我的
ViewHolder
构造函数需要
TextView
参数。我是否应该将其改回
View
参数,并在构造函数内转换为
TextView
?是的。之后它将工作。原因是textview已经有父项。但是我的
ViewHolder
构造函数需要
textview
参数。我是否应该将其改回
View
参数,并在构造函数内转换为
TextView
?是的。之后它将工作。原因是textview已具有父级。