android– 错误:指定的子级已有父级.您必须首先在孩子的父母上调用removeView()

android– 错误:指定的子级已有父级.您必须首先在孩子的父母上调用removeView(),第1张

概述无法理解有什么不对,第二天就打破了我的脑袋……我想使用带有2个选项卡的TabLayout,其中第一个带有ArtistModel的RecyclerView,但是当我用RecyclerView给Fragment充气时会出现这个错误.这是我的代码.分段packagecom.shagi.yandex.lookart.fragment;importandroid.app.

无法理解有什么不对,第二天就打破了我的脑袋……

我想使用带有2个选项卡的TabLayout,其中第一个带有ArtistModel的RecyclerVIEw,
但是当我用RecyclerVIEw给Fragment充气时会出现这个错误.

这是我的代码.
分段

package com.shagi.yandex.lookart.fragment;    import androID.app.Fragment;import androID.os.Bundle;import androID.support.v7.Widget.linearlayoutmanager;import androID.support.v7.Widget.RecyclerVIEw;import androID.util.Log;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import com.shagi.yandex.lookart.JsonHelper;import com.shagi.yandex.lookart.MainActivity;import com.shagi.yandex.lookart.R;import com.shagi.yandex.lookart.adaptor.ArtistsAdapter;import com.shagi.yandex.lookart.pojo.Artist;import java.util.List;import java.util.concurrent.ExecutionException;    /** * A simple {@link Fragment} subclass. */public class ArtistsFragment extends Fragment {    private RecyclerVIEw rvArtists;    private RecyclerVIEw.LayoutManager layoutManager;    private ArtistsAdapter adapter;    private List<Artist> artists;    public MainActivity activity;    public ArtistsFragment() {        // required empty public constructor    }    @OverrIDe    public voID onActivityCreated(Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        if (getActivity() != null) {            activity = (MainActivity) getActivity();        }        loadArtistModels();    }    @OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container,                             Bundle savedInstanceState) {        VIEw rootVIEw = inflater.inflate(R.layout.fragment_artists, container, false);        rvArtists = (RecyclerVIEw) rootVIEw.findVIEwByID(R.ID.rvArtists);        layoutManager = new linearlayoutmanager(getActivity());        rvArtists.setLayoutManager(layoutManager);        artists = loadArtistModels();        adapter = new ArtistsAdapter(artists);        rvArtists.setAdapter(adapter);        // Inflate the layout for this fragment        return rootVIEw;    }    private List<Artist> loadArtistModels() {        try {            return new JsonHelper().execute().get();        } catch (InterruptedException e) {            e.printstacktrace();        } catch (ExecutionException e) {            e.printstacktrace();        }        return null;    }}

适配器

package com.shagi.yandex.lookart.adaptor;import androID.support.v7.Widget.RecyclerVIEw;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.ImageVIEw;import androID.Widget.TextVIEw;import com.shagi.yandex.lookart.DownloadImageTask;import com.shagi.yandex.lookart.R;import com.shagi.yandex.lookart.pojo.Artist;import java.util.List;/** * Created by Shagi on 06.04.2016. */public class ArtistsAdapter extends RecyclerVIEw.Adapter<ArtistsAdapter.VIEwHolder> {    List<Artist> artists;    public ArtistsAdapter(List<Artist> artists) {        this.artists = artists;    }    @OverrIDe    public ArtistsAdapter.VIEwHolder onCreateVIEwHolder(VIEwGroup parent, int vIEwType) {        VIEw v = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_artist, parent, false);        ImageVIEw smallCover = (ImageVIEw) v.findVIEwByID(R.ID.small_cover);        TextVIEw name = (TextVIEw) v.findVIEwByID(R.ID.tvartistname);        TextVIEw style = (TextVIEw) v.findVIEwByID(R.ID.tvStyle);        TextVIEw albums = (TextVIEw) v.findVIEwByID(R.ID.tvAlbums);        return new VIEwHolder(parent, smallCover, name, style, albums);    }    @OverrIDe    public voID onBindVIEwHolder(VIEwHolder holder, int position) {        // - get element from your dataset at this position        // - replace the contents of the vIEw with that element        Artist artist = artists.get(position);        new DownloadImageTask(holder.smallCover).execute(artist.getCover().getSmall());        holder.artistname.setText(artist.getname());        String style = "";        for (String string : artist.getGenres()) {            style += string + " ";        }        holder.artistStyle.setText(style);        String albums = "альбомов " + artist.getAlbums() + ", треков " + artist.getTracks();        holder.artistAlbums.setText(albums);    }    @OverrIDe    public int getItemCount() {        return artists.size();    }        public static class VIEwHolder extends RecyclerVIEw.VIEwHolder {        // each data item is just a string in this case        public ImageVIEw smallCover;        public TextVIEw artistname;        public TextVIEw artistStyle;        public TextVIEw artistAlbums;        public VIEwHolder(VIEw v, ImageVIEw img, TextVIEw artistname, TextVIEw artistStyle, TextVIEw artistAlbums) {            super(v);            smallCover = img;            this.artistname = artistname;            this.artistStyle = artistStyle;            this.artistAlbums = artistAlbums;        }    }}

和MainActivity

package com.shagi.yandex.lookart;import androID.app.FragmentManager;import androID.os.Bundle;import androID.support.design.Widget.TabLayout;import androID.support.v4.content.ContextCompat;import androID.support.v4.vIEw.VIEwPager;import androID.support.v7.app.AppCompatActivity;import androID.support.v7.Widget.Toolbar;    import androID.vIEw.Menu;import androID.vIEw.MenuItem;    import com.shagi.yandex.lookart.adaptor.TabAdaptor;import com.shagi.yandex.lookart.fragment.SplashFragment;public class MainActivity extends AppCompatActivity {    FragmentManager fragmentManager;    PreferenceHelper preferenceHelper;    TabAdaptor tabAdaptor;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        PreferenceHelper.getInstance().init(getApplicationContext());        preferenceHelper = PreferenceHelper.getInstance();        fragmentManager = getFragmentManager();        //runSplash();        setUI();    }    @OverrIDe    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        MenuItem splashItem = menu.findItem(R.ID.action_splash);        splashItem.setChecked(preferenceHelper.getBoolean(PreferenceHelper.SPLASH_IS_INVISIBLE));        return true;    }    @OverrIDe    public boolean onoptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroIDManifest.xml.        int ID = item.getItemID();        //noinspection SimplifiableIfStatement        if (ID == R.ID.action_splash) {            item.setChecked(!item.isChecked());            preferenceHelper.putBoolean(PreferenceHelper.SPLASH_IS_INVISIBLE, item.isChecked());            return true;        }        return super.onoptionsItemSelected(item);    }    public voID runSplash() {        if (!preferenceHelper.getBoolean(PreferenceHelper.SPLASH_IS_INVISIBLE)) {            SplashFragment splashFragment = new SplashFragment();            fragmentManager.beginTransaction()                    .replace(R.ID.content_frame, splashFragment).addToBackStack(null).commit();        }    }    public voID setUI() {        Toolbar toolbar = (Toolbar) findVIEwByID(R.ID.toolbar);        if (toolbar != null) {            toolbar.setTitleTextcolor(ContextCompat.getcolor(getApplicationContext(), R.color.white));            setSupportActionbar(toolbar);        }        TabLayout tabLayout = (TabLayout) findVIEwByID(R.ID.tab_layout);        tabLayout.addTab(tabLayout.newTab().setText(R.string.artists_tab));        tabLayout.addTab(tabLayout.newTab().setText(R.string.selected_artist_tab));        final VIEwPager vIEwPager = (VIEwPager) findVIEwByID(R.ID.pager);        tabAdaptor = new TabAdaptor(fragmentManager, 2);        vIEwPager.setAdapter(tabAdaptor);        vIEwPager.addOnPagechangelistener(new TabLayout.TabLayoutOnPagechangelistener(tabLayout));        tabLayout.setonTabSelectedListener(new TabLayout.OnTabSelectedListener() {            @OverrIDe            public voID onTabSelected(TabLayout.Tab tab) {                vIEwPager.setCurrentItem(tab.getposition());            }            @OverrIDe            public voID onTabUnselected(TabLayout.Tab tab) {            }            @OverrIDe            public voID onTabReselected(TabLayout.Tab tab) {            }        });        }    }

堆栈跟踪问

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:4066)    at androID.vIEw.VIEwGroup.addVIEw(VIEwGroup.java:3916)    at androID.vIEw.VIEwGroup.addVIEw(VIEwGroup.java:3857)    at androID.support.v7.Widget.RecyclerVIEw.addVIEw(RecyclerVIEw.java:585)    at androID.support.v7.Widget.ChildHelper.addVIEw(ChildHelper.java:107)    at androID.support.v7.Widget.RecyclerVIEw$LayoutManager.addVIEwInt(RecyclerVIEw.java:6249)    at androID.support.v7.Widget.RecyclerVIEw$LayoutManager.addVIEw(RecyclerVIEw.java:6207)    at androID.support.v7.Widget.RecyclerVIEw$LayoutManager.addVIEw(RecyclerVIEw.java:6195)    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:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.FrameLayout.layoutChildren(FrameLayout.java:639)    at androID.Widget.FrameLayout.onLayout(FrameLayout.java:574)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.support.v4.vIEw.VIEwPager.onLayout(VIEwPager.java:1627)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    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:1133)    at androID.support.design.Widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.FrameLayout.layoutChildren(FrameLayout.java:639)    at androID.Widget.FrameLayout.onLayout(FrameLayout.java:574)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.FrameLayout.layoutChildren(FrameLayout.java:639)    at androID.Widget.FrameLayout.onLayout(FrameLayout.java:574)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.linearLayout.setChildFrame(linearLayout.java:1959)    at androID.Widget.linearLayout.layoutVertical(linearLayout.java:1813)    at androID.Widget.linearLayout.onLayout(linearLayout.java:1722)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.FrameLayout.layoutChildren(FrameLayout.java:639)    at androID.Widget.FrameLayout.onLayout(FrameLayout.java:574)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.linearLayout.setChildFrame(linearLayout.java:1959)    at androID.Widget.linearLayout.layoutVertical(linearLayout.java:1813)    at androID.Widget.linearLayout.onLayout(linearLayout.java:1722)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.Widget.FrameLayout.layoutChildren(FrameLayout.java:639)    at androID.Widget.FrameLayout.onLayout(FrameLayout.java:574)    at androID.vIEw.VIEw.layout(VIEw.java:16001)    at androID.vIEw.VIEwGroup.layout(VIEwGroup.java:5181)    at androID.vIEw.VIEwRootImpl.performlayout(VIEwRootImpl.java:2467)    at androID.vIEw.VIEwRootImpl.performTraversals(VIEwRootImpl.java:2164)    at androID.vIEw.VIEwRootImpl.doTraversal(VIEwRootImpl.java:1282)    at androID.

如果有什么你无法解决的问题,请询问.看来我自己也解决不了.

解决方法:

你应该在你的onCreateVIEw()方法中将VIEw v而不是parent传递给你的VIEwHolder.而且最好在VIEwholder中使用initialise VIEws而不是onCreateVIEw()

VIEw v = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_artist, parent, false);

更新这一行

return new VIEwHolder(parent, smallCover, name, style, albums);

return new VIEwHolder(v, smallCover, name, style, albums);
总结

以上是内存溢出为你收集整理的android – 错误:指定的子级已有父级.您必须首先在孩子的父母上调用removeView()全部内容,希望文章能够帮你解决android – 错误:指定的子级已有父级.您必须首先在孩子的父母上调用removeView()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1108260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存