0

I have 2 recycler view adapter, the first is working perfect , the second one I am having the below error,

 E/RecyclerView: No adapter attached; skipping layout

is it possible this is the mistake ?

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

both have different adapter

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();

this is 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 class

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();
        }

    }

}

my adapter

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();
    }

}

my adapter 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();
    }

}
Moudiz
  • 7,211
  • 22
  • 78
  • 156
  • Refer this : http://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout. The difference is setting the adapter in a delayed method, instead on the main thread. – Yash Feb 16 '16 at 17:47
  • @Yashasvi i did saw that answer and I have same in my code , I mean the first adapter is working , and the first one is the same in the second but different adapter, why it is not working – Moudiz Feb 16 '16 at 17:58
  • Gents, looks good. But it's amazing to me that almost every article/blog on RecyclerViews has its focus on creating a list, but none on saving the list. It does no good to create a beautifully crafted/valuable list (say a big list of songs I want to download) and then have the list literally be destroyed if I navigate away from the list with the single press of the back button. Why wouldn't saving state code be a requirement for creating every RecyclerView list just like the other requirements: the adapter, the layoutmanager, onCreateViewHolder, onBindViewHolder and getItemCount? Thoughts? – AJW Feb 17 '16 at 03:32
  • @AJW I am still working on the recyclerview and as you can see I am facing problems, it does look good if you read it , but if you test it trust me it wont work. as for saving the list , I am usting sqlite for saving the data and retrieving it , is there another way ? – Moudiz Feb 17 '16 at 06:32
  • I guess this is the reason for your issue. See here [link](http://screencast.com/t/4TVJxJjs) – Sabari Feb 17 '16 at 08:55
  • @Sabari oh it is possible this is the reason i didnt notice that, ill test it and ill refer to you – Moudiz Feb 17 '16 at 09:37
  • @Moudiz Ok hopefully Sabari found your error and is an easy fix. If you don't mind can you post your code related to saving the data to sqlite? I am still trying to understand how to do that and populate the recyclerview list with dynamically adding and deleting list items. – AJW Feb 17 '16 at 12:43
  • @AJW so you want your recyclerview read from database ? the you insert the data in database from server ? is that you need ? – Moudiz Feb 17 '16 at 13:04
  • Yes the user inputs data and the data is added to the database and then the database fills Cardviews to be shown on the recyclerview list. Thoughts? – AJW Feb 17 '16 at 14:24
  • @AJW okay ill do that tomrow or by friday , when i do it ill show you my code okay ? – Moudiz Feb 17 '16 at 14:42
  • Sounds good, thank you. – AJW Feb 17 '16 at 15:34
  • @Sabari you were right please post it as an aswer to accept it – Moudiz Feb 18 '16 at 06:36
  • @Moudiz I have posted my answer below. Thank you – Sabari Feb 18 '16 at 09:23

1 Answers1

1

Here you are setting adapter for 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();

And here again you are setting adapter for same mRecyclerView, not for 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();

This is the reason for the issue (E/RecyclerView: No adapter attached; skipping layout).

Sabari
  • 1,963
  • 1
  • 13
  • 10