无法理解有什么不对,第二天就打破了我的脑袋……
我想使用带有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()所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)