【问题标题】:E/RecyclerView: No adapter attached; skipping layout with fragmentsE/RecyclerView:没有附加适配器;使用片段跳过布局
【发布时间】:2016-09-13 04:09:41
【问题描述】:

这是我在 Android Studio 中的第一个应用程序,我无法解决此错误,我需要帮助,谢谢。

E/RecyclerView: No adapter attached; skipping layout
E/RecyclerView: No adapter attached; skipping layout

主活动

public class MainActivity extends AppCompatActivity {
private ViewPager mPager;
private SlidingTabLayout mTabs;
private Toolbar toolbar;
private RecyclerView recyclerView;

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



    //toolbar
    toolbar= (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //Sliding Tab
    mPager = (ViewPager) findViewById(R.id.pager);
    mTabs= (SlidingTabLayout) findViewById(R.id.tabs);
    mPager.setAdapter(new MyAdapter(getSupportFragmentManager(),this));


    mTabs.setDistributeEvenly(true);
    mTabs.setCustomTabView(R.layout.tab_view, R.id.tabTeks);
    mTabs.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
    mTabs.setSelectedIndicatorColors(getResources().getColor(R.color.colorAccent));

    mTabs.setViewPager(mPager);

}

我的适配器

public class MyAdapter extends FragmentPagerAdapter {
private Context mContext;
private String[] titles ={"OVERVIEW","PORTOFOLIO","TEAM"};
int [] icons = new int []{R.mipmap.ic_adopcion, R.mipmap.ic_launcher, R.mipmap.ic_launcher};
private int heightIcon;

public MyAdapter(FragmentManager fm, Context c) {
    super(fm);
    mContext=c;
    double scale=c.getResources().getDisplayMetrics().density;
    heightIcon=(int)(30*scale+0.5f);
}

@Override
public Fragment getItem(int position) {
    Fragment frag=null;
    if (position==0){
        frag = new OverviewFragment();
    } else if(position==1){
        frag= new TeamFragment();

    } else if(position==2){
        frag = new PortofolioFragment();
    }
    Bundle b = new Bundle();
    b.putInt("position", position);
    frag.setArguments(b);
    return frag;
}

@Override
public int getCount() {

    return titles.length;
}

@Override
public CharSequence getPageTitle(int position) {
    Drawable d = mContext.getResources().getDrawable(icons[position]);
    d.setBounds(0,0,heightIcon,heightIcon);

    ImageSpan is = new ImageSpan(d);
    SpannableString sp = new SpannableString(" ");
    sp.setSpan(is,0,sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    return (sp);
}

项目适配器

public class ItemAdapter extends RecyclerView.Adapter<ItemHolder> {
private List<Perros> PerrosList;

public ItemAdapter(List<Perros> PerrosList){
    this.PerrosList = PerrosList;
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_layout, parent, false);
    return new ItemHolder(itemView);
}

@Override
public void onBindViewHolder(ItemHolder holder, int position) {
    Perros item = PerrosList.get(position);
    holder.txtCelebName.setText(item.getName());
    holder.txtCelebMovie.setText(item.getFamousMovie());
    Picasso.with(holder.txtCelebName.getContext()).load(item.getProfilePhotoLocation()).into(holder.profileImage);
    Picasso.with(holder.txtCelebName.getContext()).load(item.getImgsex()).into(holder.imgsex);
}

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

}

片段

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
    //return inflater.inflate(R.layout.fragment_overview, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRequestQueue = MySingleton.getInstance().getRequestQueue();
    array = new JsonObjectRequest(Request.Method.GET, url, "", new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.d(TAG, response.toString());
            itemAdapter = new ItemAdapter(getPerros(response));
            recyclerView.setAdapter(itemAdapter);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        Log.d(TAG,error.toString());
        }
    });
    mRequestQueue.add(array);
    return rootView;
    //return inflater.inflate(R.layout.fragment_overview, container, false);
}
private List<Perros> getPerros(JSONObject jsonObject){
    List<Perros> lista = new ArrayList<>();
    try {
        JSONArray array= jsonObject.getJSONArray("alumnos");
        for (int i=0; i<array.length(); i++){
            JSONObject objeto = array.getJSONObject(i);
            Perros perro = new Perros();
            perro.setName(objeto.getString("nombre"));
            perro.setFamousMovie(objeto.getString("direccion"));
            perro.setProfilePhotoLocation(img+objeto.getString("rutaimagen"));
            perro.setImgsex(img+objeto.getString("sexo"));
            lista.add(perro);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return lista;
}

【问题讨论】:

  • 您确定您的onResponse 已被调用?
  • 你没有在linearLayout管理器中定义方向...尝试定义方向

标签: android json android-recyclerview fragment


【解决方案1】:

在 onCreate() 方法中获取 ArrayAdapter 中的数据之前,需要设置空白适配器。第一的 在 getItemCount() 方法中的 ItemAdapter 中的所有内容。

return (null != PerrosList ? PerrosList.size() : 0);

【讨论】:

  • @Daniel 我没有在 volley 库上工作过,你能告诉我 volley 库中有没有 On success 方法吗?我不确定,但我认为你是在后台线程中设置适配器,你需要设置你的整个数据何时添加到数组列表中,之后如果 volley 库中有 onSuccess 方法,那么你必须在那里设置适配器
  • 嗨,我的朋友,我会说一点英语。这是我的项目 [mediafire.com/download/31tfxywdg3jjl43/DogMain.rar],我尝试使用您的代码但不起作用,也许您可​​以帮助我。谢谢。
【解决方案2】:

onCreateView代码改成这个

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
//return inflater.inflate(R.layout.fragment_overview, container, false);

recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRequestQueue = MySingleton.getInstance().getRequestQueue();
itemAdapter = new ItemAdapter(new ArrayList<Perros>());
array = new JsonObjectRequest(Request.Method.GET, url, "", new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Log.d(TAG, response.toString());
        itemAdapter.setData(getPerros(response));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    Log.d(TAG,error.toString());
    }
});
mRequestQueue.add(array);
return rootView;
//return inflater.inflate(R.layout.fragment_overview, container, false);
}

并在您的适配器代码中添加此方法

void setData(List<Perros> data)
{
 this.PerrosList.clear();
 for(Perros p:data){
 this.PerrosList.add(p);
 }
 notifyDataSetChanged();
}

【讨论】:

【解决方案3】:

在创建阶段没有设置适配器时会发生这种情况:当 api 响应得到时调用 notifyDataSetChanged()

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


        magazineAdapter = new MagazineAdapter(getContext(), null, this );
        newClipRecyclerView.setAdapter(magazineAdapter);
        magazineAdapter.notifyDataSetChanged();

       APICall();
}

public void APICall() {
    if(Response.isSuccessfull()){
    mRecyclerView.setAdapter(mAdapter);
   }
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:

mAdapter.notifyDataSetChanged();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多