2016-02-16 47 views
0

我有2个回收视图适配器,首先是工作完美,我有下面的错误,第二个,2回收站视图适配器,第一个显示图像第二个显示错误没有附加适配器;跳绳布局

E/RecyclerView: No adapter attached; skipping layout 

是否有可能是这样的错误呢?

 if (mListener != null) 
      mListener.myMethod(Listitem); 

都有不同的适配器

private RecyclerView mRecyclerView; 
private RecyclerView.Adapter mAdapter; 

private RecyclerView mRecyclerView1; 
private RecyclerView.Adapter mAdapter1; 

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
mRecyclerView.setHasFixedSize(true); 
mRecyclerView.setLayoutManager(
     new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false)); 


RecyclerOkHttpHandler handler = new RecyclerOkHttpHandler(this, new RecyclerOkHttpHandler.MyInterface() { 
    @Override 
    public void myMethod(ArrayList result) { 
     mAdapter = new MyAdapter(result,Search.this); 
     mAdapter.notifyDataSetChanged(); 
     mRecyclerView.setAdapter(mAdapter); 
    } 
}); 

handler.execute(); 



//second recycler 
mRecyclerView1 = (RecyclerView) findViewById(R.id.my_recycler_view1); 
mRecyclerView1.setHasFixedSize(true); 
mRecyclerView1.setLayoutManager(
     new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false)); 

RecyclerOkHttpHandler1 handler1 = new RecyclerOkHttpHandler1(this, new RecyclerOkHttpHandler1.MyInterface() { 
    @Override 
    public void myMethod(ArrayList result1) { 
     mAdapter1 = new MyAdapter1(result1,Search.this); 
     mAdapter1.notifyDataSetChanged(); 
     mRecyclerView.setAdapter(mAdapter1); 
    } 
}); 

handler1.execute(); 

这是RecyclerOkHttpHandler

public class RecyclerOkHttpHandler extends AsyncTask<String, Void, String> { 
    private Context mContext; 
    private MyInterface mListener; 
    public RecyclerOkHttpHandler (Context context, MyInterface mListener){ 
     mContext = context; 
     this.mListener = mListener; 
    } 
    public interface MyInterface { 
     public void myMethod(ArrayList result); 
    } 

    private final String Fetch_URL = "http://je.com/getdata.php"; 
    // ArrayList<Listitem> Listitem; 
    ArrayList<CategoryList> Listitem; 
    int resulta; 

    OkHttpClient httpClient = new OkHttpClient(); 
    ListView list; 
    String myJSON; 
    JSONArray peoples = null; 
    InputStream inputStream = null; 

    @Override 
    protected String doInBackground(String... params) { 
     Log.d("okhttp Fetch_URL", Fetch_URL); 

     Request.Builder builder = new Request.Builder(); 
     builder.url(Fetch_URL); 

     Request request = builder.build(); 

     String result = null; 
     try { 
      Response response = httpClient.newCall(request).execute(); 
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
      inputStream = response.body().byteStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) 
      { 
       sb.append(line + "\n"); 
      } 
      result = sb.toString(); 
      resulta = 1; //"Success 
      // return response.body().bytes(); 
     } catch (Exception e) { 
      Toast.makeText(mContext, "Connection failed, check your connection", 
        Toast.LENGTH_LONG).show(); 
      e.printStackTrace();  } 
     finally { 
      try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
     } 
     return result; 
    } 
    @Override 
    protected void onPostExecute(String result){ 
     if(resulta ==1){ 
      myJSON=result; 
      Log.e("result",result); 

      showList(); 
     } 
     else{ 
      Log.e("d","there is an error on postexecute in okhhttphandler.java"); 

     } 
    } 

    protected void showList(){ 
     try { 

      JSONObject jsonObj = new JSONObject(myJSON); 
      peoples = jsonObj.getJSONArray("result"); 
      System.out.println("Length:"+peoples.length()); 
      int J_length=peoples.length()-1; 
      //JSONObject maxj = peoples.getJSONObject(peoples.length() - 1); 
      // max of arrray 

      jsonObj= peoples.getJSONObject(J_length); 

      String j_id= jsonObj.getString("id"); 
      int _id = Integer.parseInt(j_id); 

      // if (_id < d_id) { 
      System.out.println("Getting json result "); 

      Listitem = new ArrayList<CategoryList>(); 
      for (int i = 0; i < peoples.length(); i++) { 
       JSONObject c = peoples.getJSONObject(i); 
       // String id ="2"; 
       String id = c.getString("id"); 
       String url = c.getString("url"); 

       int intid = 0; 
       try { 
        intid = Integer.parseInt(id.toString()); 
       } catch (NumberFormatException nfe) { 
        System.out.println("Could not parse " + nfe); 
       } 


       // DatabaseHandler db = new DatabaseHandler(mContext); 
       Log.d("Insert: ", "Inserting .."); 

       //db.addObjects(new Objects(intid, "Image1", url, "IMAGES", "Leb Funny")); 


       Listitem.add(new CategoryList(id, url)); 
       System.out.println(Listitem); 
      } 
      //} 
      if (mListener != null) 
       mListener.myMethod(Listitem); 



      // GridViewAdapter adapter = new GridViewAdapter(mContext, R.layout.grid_item_layout, Listitem); 
      // gridView.setAdapter(gridAdapter); 
      //  adapter.notifyDataSetChanged(); 
      //  list.setAdapter(adapter); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

RecyclerOkHttpHandler1类

public class RecyclerOkHttpHandler1 extends AsyncTask<String, Void, String> { 
    private Context mContext; 
    private MyInterface mListener; 
    public RecyclerOkHttpHandler1(Context context, MyInterface mListener){ 
     mContext = context; 
     this.mListener = mListener; 
    } 
    public interface MyInterface { 
     public void myMethod(ArrayList result); 
    } 

    private final String Fetch_URL = "http://je.com/getdata.php"; 
    // ArrayList<Listitem> Listitem; 
    ArrayList<CategoryList> Listitem; 
    int resulta; 

    OkHttpClient httpClient = new OkHttpClient(); 
    ListView list; 
    String myJSON; 
    JSONArray peoples = null; 
    InputStream inputStream = null; 

    @Override 
    protected String doInBackground(String... params) { 
     Log.d("okhttp Fetch_URL", Fetch_URL); 

     Request.Builder builder = new Request.Builder(); 
     builder.url(Fetch_URL); 

     Request request = builder.build(); 

     String result = null; 
     try { 
      Response response = httpClient.newCall(request).execute(); 
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
      inputStream = response.body().byteStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) 
      { 
       sb.append(line + "\n"); 
      } 
      result = sb.toString(); 
      resulta = 1; //"Success 
      // return response.body().bytes(); 
     } catch (Exception e) { 
      Toast.makeText(mContext, "Connection failed, check your connection", 
        Toast.LENGTH_LONG).show(); 
      e.printStackTrace();  } 
     finally { 
      try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
     } 
     return result; 
    } 
    @Override 
    protected void onPostExecute(String result){ 
     if(resulta ==1){ 
      myJSON=result; 
      Log.e("result",result); 

      showList(); 
     } 
     else{ 
      Log.e("d","there is an error on postexecute in okhhttphandler.java"); 

     } 
    } 

    protected void showList(){ 
     try { 

      JSONObject jsonObj = new JSONObject(myJSON); 
      peoples = jsonObj.getJSONArray("result"); 
      System.out.println("Length:"+peoples.length()); 
      int J_length=peoples.length()-1; 
      //JSONObject maxj = peoples.getJSONObject(peoples.length() - 1); 
      // max of arrray 

      jsonObj= peoples.getJSONObject(J_length); 

      String j_id= jsonObj.getString("id"); 
      int _id = Integer.parseInt(j_id); 
      System.out.println(j_id); 

      //max of 


      // if (_id < d_id) { 
      System.out.println("Getting json result "); 

      Listitem = new ArrayList<CategoryList>(); 
      for (int i = 0; i < peoples.length(); i++) { 
       JSONObject c = peoples.getJSONObject(i); 
       // String id ="2"; 
       String id = c.getString("id"); 
       String url = c.getString("url"); 

       int intid = 0; 
       try { 
        intid = Integer.parseInt(id.toString()); 
       } catch (NumberFormatException nfe) { 
        System.out.println("Could not parse " + nfe); 
       } 


       // DatabaseHandler db = new DatabaseHandler(mContext); 
       Log.d("Insert: ", "Inserting .."); 

       //db.addObjects(new Objects(intid, "Image1", url, "IMAGES", "Leb Funny")); 


       Listitem.add(new CategoryList(id, url)); 
       System.out.println(Listitem); 
      } 
      //} 
      if (mListener != null) 
       mListener.myMethod(Listitem); 



     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

我的适配器

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private ArrayList<CategoryList> mDataset; 
    Context mContext; 
    public class ImageViewHolder extends RecyclerView.ViewHolder { 
     //ImageView mImage; 
     public TextView txtHeader; 
     public TextView txtFooter; 
     public ImageView image; 
     public ImageViewHolder(View itemView) { 
      super (itemView); 
      txtHeader = (TextView) itemView.findViewById(R.id.firstLine); 
      txtFooter = (TextView) itemView.findViewById(R.id.secondLine); 
      image = (ImageView) itemView.findViewById(R.id.imagecateg); 
     } 
    } 


    public void add(int position, CategoryList item) { //changed from string to listitem 

     mDataset.add(position, item); 
     notifyItemInserted(position); 
    } 

    public void remove(String item) { 
     int position = mDataset.indexOf(item); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(ArrayList<CategoryList> myDataset, Context context) { 

     mDataset = myDataset; 
     mContext = context; 

    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 

      // create a new view 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_search, parent, false); 
      // set the view's size, margins, paddings and layout parameters 
      ImageViewHolder vh = new ImageViewHolder(v); 
      return vh; 
     } 


    private static final int TYPE_IMAGE = 1; 
    private static final int TYPE_GROUP = 2; 

    @Override 
    public int getItemViewType(int position) { 
     // here your custom logic to choose the view type 
     return position; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) { 

       ImageViewHolder viewHolder = (ImageViewHolder) TextViewHolder; 
       // viewHolder.txtHeader.setText(...) 
     final CategoryList item; 

     // final String name = mDataset.get(position); 
     item = mDataset.get(position); 
     // viewHolder.txtHeader.setText(mDataset.get(position)); 
     // this to be removed when added text 
     // viewHolder.txtHeader.setText(mDataset.get(position).getUrl()); 


     Picasso.with(mContext) 
       .load(item.getUrl()) 
       .placeholder(R.drawable.logo) 
       .fit() 
       .noFade() 
       .into(viewHolder.image); 

       /* viewHolder.txtFooter.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(item); 
        } 
       });*/ 

       // viewHolder.txtFooter.setText("Footer: " + mDataset.get(position)); 

     } 


    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

} 

我的适配器1

public class MyAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private ArrayList<CategoryList> mDataset; 
    Context mContext; 
    public class ImageViewHolder extends RecyclerView.ViewHolder { 
     //ImageView mImage; 
     public TextView txtHeader; 
     public TextView txtFooter; 
     public ImageView image; 
     public ImageViewHolder(View itemView) { 
      super (itemView); 
      txtHeader = (TextView) itemView.findViewById(R.id.firstLine); 
      txtFooter = (TextView) itemView.findViewById(R.id.secondLine); 
      image = (ImageView) itemView.findViewById(R.id.imagecateg); 
     } 
    } 


    public void add(int position, CategoryList item) { //changed from string to listitem 

     mDataset.add(position, item); 
     notifyItemInserted(position); 
    } 

    public void remove(String item) { 
     int position = mDataset.indexOf(item); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter1(ArrayList<CategoryList> myDataset, Context context) { 

     mDataset = myDataset; 
     mContext = context; 

    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 

     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_search, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ImageViewHolder vh = new ImageViewHolder(v); 
     return vh; 
    } 


    private static final int TYPE_IMAGE = 1; 
    private static final int TYPE_GROUP = 2; 

    @Override 
    public int getItemViewType(int position) { 
     // here your custom logic to choose the view type 
     return position; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) { 

     ImageViewHolder viewHolder = (ImageViewHolder) TextViewHolder; 
     // viewHolder.txtHeader.setText(...) 
     final CategoryList item; 

     // final String name = mDataset.get(position); 
     item = mDataset.get(position); 
     // viewHolder.txtHeader.setText(mDataset.get(position)); 
     // this to be removed when added text 
     // viewHolder.txtHeader.setText(mDataset.get(position).getUrl()); 


     Picasso.with(mContext) 
       .load(item.getUrl()) 
       .placeholder(R.drawable.logo) 
       .fit() 
       .noFade() 
       .into(viewHolder.image); 

       /* viewHolder.txtFooter.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         remove(item); 
        } 
       });*/ 

     // viewHolder.txtFooter.setText("Footer: " + mDataset.get(position)); 

    } 


    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

} 
+0

请参阅:http://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout。区别在于将适配器设置为延迟方法,而不是在主线程中。 – Yashasvi

+0

@Yashasvi @Yashasvi我看到了答案,我在我的代码中有相同的意思,我的意思是第一个适配器工作,第一个是在第二个但不同的适配器相同,为什么它不工作 – Moudiz

+0

男性,看起来不错。但对我来说几乎每篇关于RecyclerViews的文章/博客都关注于创建列表,但没有保存列表。创建一个制作精美的/有价值的列表(比如我想下载的一大串歌曲)并没有好处,然后如果我通过单击后退按钮从列表中导航,就可以销毁列表。为什么不保存状态码就像创建其他需求一样创建每个RecyclerView列表:适配器,布局管理器,onCreateViewHolder,onBindViewHolder和getItemCount?思考? – AJW

回答

1

在这里,你是为mRecyclerView

设置适配器
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
mRecyclerView.setHasFixedSize(true); 
mRecyclerView.setLayoutManager(
     new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false)); 


RecyclerOkHttpHandler handler = new RecyclerOkHttpHandler(this, new RecyclerOkHttpHandler.MyInterface() { 
    @Override 
    public void myMethod(ArrayList result) { 
     mAdapter = new MyAdapter(result,Search.this); 
     mAdapter.notifyDataSetChanged(); 
     mRecyclerView.setAdapter(mAdapter); 
    } 
}); 

handler.execute(); 

在这里再次要为同一mRecyclerView设置适配器,而不是用于mRecyclerView1

//second recycler 
mRecyclerView1 = (RecyclerView) findViewById(R.id.my_recycler_view1); 
mRecyclerView1.setHasFixedSize(true); 
mRecyclerView1.setLayoutManager(
     new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false)); 

RecyclerOkHttpHandler1 handler1 = new RecyclerOkHttpHandler1(this, new RecyclerOkHttpHandler1.MyInterface() { 
    @Override 
    public void myMethod(ArrayList result1) { 
     mAdapter1 = new MyAdapter1(result1,Search.this); 
     mAdapter1.notifyDataSetChanged(); 
     mRecyclerView.setAdapter(mAdapter1); 
    } 
}); 

handler1.execute(); 

这是问题的原因(E/Recycler查看:没有连接适配器;跳过布局)。

相关问题