【问题标题】:No adapter attached; skipping layout Only displays 1st content未连接适配器;跳过布局仅显示第一个内容
【发布时间】:2016-10-06 12:52:31
【问题描述】:

我是 android 编程新手,我收到错误 “未连接适配器;跳过布局”。我的应用程序运行但是当我点击打开我的片段时,里面有一个卡片视图,只显示我的 ArrayList 的第一个内容。 我一直在关注本教程:https://code.tutsplus.com/tutorials/getting-started-with-recyclerview-and-cardview-on-android--cms-23465,但我正在以不同的方式进行操作。我使用的是片段而不是活动,但我认为这不是问题。所以,这里有我的Activity

 public class Av_ninja extends AppCompatActivity {

TabLayout tabLayout;
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_av_ninja);

    viewPager = (ViewPager) findViewById(R.id.viewPager);
    viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager(), getApplicationContext()));

    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(viewPager);

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

        }
    });
}

private class CustomAdapter extends FragmentPagerAdapter{
    private String fragmentes [] = {"Info","Abilitities"};

    public CustomAdapter(FragmentManager suppFragmentManager, Context applicaContext){
        super(suppFragmentManager);
    }

    @Override
    public Fragment getItem(int position){
        switch (position){
            case 0:
                return new Fragment1();
            case 1:
                return new Fragment2();
            default:
                return null;
        }

    }

    @Override
    public int getCount(){
        return fragmentes.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentes[position];
    }
}
}

片段

public class Fragment1 extends Fragment {

ImageView Icons;
TextView Titulos;
TextView Textos;


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   // return inflater.inflate(R.layout.frag1,container,false);
  View rootView = inflater.inflate(R.layout.card_ninja_info,container,false);

    Icons = (ImageView) rootView.findViewById(R.id.Icons);
    Titulos = (TextView) rootView.findViewById(R.id.Titulos);
    Textos = (TextView) rootView.findViewById(R.id.Textos);

    Icons.setImageResource(R.drawable.offenseicon);
    Titulos.setText("Role");
    Textos.setText("Scout");

  return rootView;
}
} 

RecyclerView

public class RecyclerViewAv extends Fragment{

private List<Heroi> herois;
private RecyclerView rv;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    //return inflater.inflate(R.layout.frag2,container,false);
    View rootView = inflater.inflate(R.layout.card_ninja_info,container,false);

    rv = (RecyclerView)rootView.findViewById(R.id.rv_frag1);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);
    rv.setHasFixedSize(true);

    initializeData();
    initializeAdapter();

    return rootView;
}


private void initializeData(){
    herois = new ArrayList<>();
    herois.add(new Heroi(R.drawable.offenseicon, "Role", "Scout"));
    herois.add(new Heroi(R.drawable.identityicon, "Identity", "Genji Shimada"));
    herois.add(new Heroi(R.drawable.workicon, "Work", "Adventurer"));
    herois.add(new Heroi(R.drawable.localizationicon, "Base of Operation", "Nepal"));
    herois.add(new Heroi(R.drawable.empresaicon, "Affiliation", "Shiamda Clan"));
    herois.add(new Heroi(R.drawable.ageicon, "Age", "27"));
    herois.add(new Heroi(R.drawable.healthicon, "Health", "100"));

}

private void initializeAdapter(){
    RVAdapter adapter = new RVAdapter(herois);
    rv.setAdapter(adapter);
}

}

适配器

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.HeroiViewHolder>{

public static class HeroiViewHolder extends RecyclerView.ViewHolder{

    CardView cv;
    ImageView Icons;
    TextView Titulos;
    TextView Textos;

    public HeroiViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        Icons = (ImageView)itemView.findViewById(R.id.Icons);
        Titulos = (TextView)itemView.findViewById(R.id.Titulos);
        Textos =  (TextView)itemView.findViewById(R.id.Textos);
    }
}

List<Heroi> herois;

RVAdapter(List<Heroi> herois){
    this.herois=herois;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView){
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public RVAdapter.HeroiViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  HeroiViewHolder hvh = new HeroiViewHolder(v);
  return hvh;
}

@Override
public void onBindViewHolder(HeroiViewHolder holder, int position) {
    holder.Icons.setImageResource(herois.get(position).photoId);
    holder.Titulos.setText(herois.get(position).tit);
    holder.Textos.setText(herois.get(position).res);
}

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

职业英雄

public class Heroi {

int photoId;
String tit;
String res;

public Heroi(int photoId, String tit, String res) {
    this.photoId = photoId;
    this.tit = tit;
    this.res = res;
}
}

提前致谢!

【问题讨论】:

  • 你要创建横向recyclerview吗?
  • 不,我想要垂直
  • 在下面查看我的答案

标签: android android-recyclerview cardview


【解决方案1】:

您可以在此处进行以下更改以使其正确:

1) 更新您的 onCreateView 方法

private RVAdapter rvAdapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    //return inflater.inflate(R.layout.frag2,container,false);
    View rootView = inflater.inflate(R.layout.card_ninja_info,container,false);

    rv = (RecyclerView)rootView.findViewById(R.id.rv_frag1);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());

    // Added here
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    rv.setHasFixedSize(true); // Here we changed order you should call it first before setting LayoutManager
    rv.setLayoutManager(llm);    

    //Set empty adapter and pass only context if you will needed inside it
    rvAdapter = new RVAdapter(getActivity());
    rv.setAdapter(rvAdapter);

    initializeData();
    initializeAdapter();

    return rootView;
}

2) 在您的适配器类中创建方法来更新您的内容列表

public void updateList(List<Heroi> herois){

   this.herois = herois;
   notifyDataSetChanged();

}

3) 仅在 initializeAdapter 方法中更新您的 contentList(无需再次设置适配器)

private void initializeAdapter(){

  rvAdapter.updateList(herois);

}

就是这样!

按以下方式更新您的适配器:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.HeroiViewHolder>{

List<Heroi> herois;

public static class HeroiViewHolder extends RecyclerView.ViewHolder{

    CardView cv;
    ImageView Icons;
    TextView Titulos;
    TextView Textos;
    Context context;


    public HeroiViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        Icons = (ImageView)itemView.findViewById(R.id.Icons);
        Titulos = (TextView)itemView.findViewById(R.id.Titulos);
        Textos =  (TextView)itemView.findViewById(R.id.Textos);
    }
}

RVAdapter(Context context){
    this.context = context;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView){
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public RVAdapter.HeroiViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  HeroiViewHolder hvh = new HeroiViewHolder(v);
  return hvh;
}

@Override
public void onBindViewHolder(HeroiViewHolder holder, int position) {
    holder.Icons.setImageResource(herois.get(position).photoId);
    holder.Titulos.setText(herois.get(position).tit);
    holder.Textos.setText(herois.get(position).res);
}

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

public void updateList(List<Heroi> herois){

       this.herois = herois;
       notifyDataSetChanged();

  }

}

【讨论】:

  • 嗨,我按照您的建议进行了更改,但不幸的是,我在这里遇到了错误:rvAdapter = new RVAdapter(getActivity()); 我尝试像 IDE 建议的那样更改为 rvAdapter = new RVAdapter((List&lt;Heroi&gt;) getActivity());,但我的应用程序仍然相同 :( 只是显示第一个内容
  • @LionK :我用您的适配器代码更新了我的答案。只需复制该代码,您就可以开始了!
【解决方案2】:

问题已解决 我刚刚删除了 RecyclerView 类并将其放入 Fragment1 类。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   // return inflater.inflate(R.layout.frag1,container,false);
    View rootView = inflater.inflate(R.layout.frag1,container,false);
    rv = (RecyclerView)rootView.findViewById(R.id.rv_frag1);

    LinearLayoutManager llm = new LinearLayoutManager(getContext());
   // llm.setOrientation(LinearLayoutManager.VERTICAL);
   // rv.setHasFixedSize(true);
    rv.setLayoutManager(llm);

    initializeData();

    rvAdapter = new RVAdapter(herois);
    rv.setAdapter(rvAdapter);

  return rootView;
}

还是谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2021-04-24
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多