0

I'm new coder of android and trying to get list of images in my server and database(mysql) but I got error and I don't know what is causing it... the error is 'E/RecyclerView: No adapter attached; skipping layout' and it happen when I'm running, anyone can help me??

    public class LoadListFromServer extends AsyncTask<String, Void, String> {

    private RecyclerView recyclerView;
    private Context context;
    private ArrayList<ImageGalleryItem> imageGalleryItems;
    private boolean pattern;

    public LoadListFromServer(RecyclerView recyclerView, Context context, boolean pattern) {
        this.recyclerView = recyclerView;
        this.context = context;
        this.pattern = pattern;
    }

    public ArrayList<ImageGalleryItem> getImageGalleryItems() {
        return imageGalleryItems;
    }

    @Override
    protected String doInBackground(String... strings) {
        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(strings[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestProperty("Content-type", "application/json");
            int responseCode = urlConnection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                return readStream(urlConnection.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);

        recyclerView.setHasFixedSize(true);

        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(context,2);
        recyclerView.setLayoutManager(layoutManager);

        imageGalleryItems = prepareData(response);
        MyAdapter adapter = new MyAdapter(context, imageGalleryItems);
        recyclerView.setAdapter(adapter);

    }

    private String readStream(InputStream in) {
        BufferedReader reader = null;
        StringBuffer response = new StringBuffer();
        try {
            reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
            String line = "";
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return response.toString();
    }

    private ArrayList<ImageGalleryItem> prepareData(String response) {
        ArrayList<ImageGalleryItem> result = null;
        try {
            JSONArray jsonArray = new JSONArray(response);
            result = new ArrayList<>(jsonArray.length());
            for (int i=0; i < jsonArray.length(); i++) {
                try {
                    JSONObject oneObject = jsonArray.getJSONObject(i);
                    String id = oneObject.getString("id");
                    String name = oneObject.getString("name");
                    result.add(new ImageGalleryItem(name, Long.parseLong(id), pattern));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        if(result == null) {
            return new ArrayList<>();
        } else {
            return result;
        }
    }
}

I wrote my adapter as MyAdapter.java:

 class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ArrayList<ImageGalleryItem> galleryList;

    public MyAdapter(Context context, ArrayList<ImageGalleryItem> galleryList) {
        this.galleryList = galleryList;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cell_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {
        final ImageGalleryItem imageGalleryItem = galleryList.get(i);
        viewHolder.title.setText(imageGalleryItem.getName());
        viewHolder.img.setScaleType(ImageView.ScaleType.FIT_XY);
        String imageFolderName;
        final boolean isPattern = imageGalleryItem.isPattern();
        if(isPattern) {
            imageFolderName =  viewHolder.img.getContext().getString(R.string.patterns_directory);
        } else {
            imageFolderName = viewHolder.img.getContext().getString(R.string.collections_directory);
        }
        LoadSVGFromServer loadSVGFromServer = new LoadSVGFromServer(viewHolder.img);
        loadSVGFromServer.execute(viewHolder.img.getContext().getString(R.string.server_base_address)
                + imageFolderName
                + imageGalleryItem.getID() + ".svg");

        viewHolder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Activity activity = (Activity) v.getContext();
                if(isPattern) {
                    Intent intent = new Intent(activity, ColoringActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable(activity.getString(R.string.CURRENT_COLLECTION_BUNDLE_KEY), imageGalleryItem);
                    intent.putExtras(b);
                    activity.startActivity(intent);
                } else {
                    Intent intent = new Intent(activity, ShowPatternsActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable(activity.getString(R.string.CURRENT_COLLECTION_BUNDLE_KEY), imageGalleryItem);
                    intent.putExtras(b);
                    activity.startActivity(intent);
                }
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView title;
        private ImageView img;
        public ViewHolder(View view) {
            super(view);
            title = (TextView)view.findViewById(R.id.title);
            img = (ImageView) view.findViewById(R.id.img);
        }
    }
}
Thientvse
  • 1,753
  • 1
  • 14
  • 23
Shirin JZ
  • 3
  • 3

1 Answers1

0

You can setup your recyclerView and set items when data received.

activity code for setup recycler view:

public class MainActivity extends AppCompatActivity {

    private MyAdapter mAdapter;

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

        setupRecyclerView();
    }

    private void setupRecyclerView(){

        recyclerView.setHasFixedSize(true);

        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(context,2);
        recyclerView.setLayoutManager(layoutManager);

        mAdapter = new MyAdapter(context);
        recyclerView.setAdapter(mAdapter);
    }
}

Pass adapter to async task:

   public class LoadListFromServer extends AsyncTask<String, Void, String> {

    private MyAdapter mAdapter;
    private Context context;
    private ArrayList<ImageGalleryItem> imageGalleryItems;
    private boolean pattern;

    public LoadListFromServer(MyAdapter adapter, Context context, boolean pattern) {
        this.mAdapter = adapter;
        this.context = context;
        this.pattern = pattern;
    }

    public ArrayList<ImageGalleryItem> getImageGalleryItems() {
        return imageGalleryItems;
    }

    @Override
    protected String doInBackground(String... strings) {
        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(strings[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestProperty("Content-type", "application/json");
            int responseCode = urlConnection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                return readStream(urlConnection.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);

        imageGalleryItems = prepareData(response);
        mAdapter.setItems(imageGalleryItems);

    }

    private String readStream(InputStream in) {
        BufferedReader reader = null;
        StringBuffer response = new StringBuffer();
        try {
            reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
            String line = "";
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return response.toString();
    }

    private ArrayList<ImageGalleryItem> prepareData(String response) {
        ArrayList<ImageGalleryItem> result = null;
        try {
            JSONArray jsonArray = new JSONArray(response);
            result = new ArrayList<>(jsonArray.length());
            for (int i=0; i < jsonArray.length(); i++) {
                try {
                    JSONObject oneObject = jsonArray.getJSONObject(i);
                    String id = oneObject.getString("id");
                    String name = oneObject.getString("name");
                    result.add(new ImageGalleryItem(name, Long.parseLong(id), pattern));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        if(result == null) {
            return new ArrayList<>();
        } else {
            return result;
        }
    }
}

Adapter with setItems method:

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ArrayList<ImageGalleryItem> galleryList;

    public MyAdapter(Context context) {
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cell_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    public void setItems(ArrayList<ImageGalleryItem> galleryList){
        this.galleryList = galleryList;
        notifyDataSetChanged();
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {
        final ImageGalleryItem imageGalleryItem = galleryList.get(i);
        viewHolder.title.setText(imageGalleryItem.getName());
        viewHolder.img.setScaleType(ImageView.ScaleType.FIT_XY);
        String imageFolderName;
        final boolean isPattern = imageGalleryItem.isPattern();
        if(isPattern) {
            imageFolderName =  viewHolder.img.getContext().getString(R.string.patterns_directory);
        } else {
            imageFolderName = viewHolder.img.getContext().getString(R.string.collections_directory);
        }
        LoadSVGFromServer loadSVGFromServer = new LoadSVGFromServer(viewHolder.img);
        loadSVGFromServer.execute(viewHolder.img.getContext().getString(R.string.server_base_address)
                + imageFolderName
                + imageGalleryItem.getID() + ".svg");

        viewHolder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Activity activity = (Activity) v.getContext();
                if(isPattern) {
                    Intent intent = new Intent(activity, ColoringActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable(activity.getString(R.string.CURRENT_COLLECTION_BUNDLE_KEY), imageGalleryItem);
                    intent.putExtras(b);
                    activity.startActivity(intent);
                } else {
                    Intent intent = new Intent(activity, ShowPatternsActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable(activity.getString(R.string.CURRENT_COLLECTION_BUNDLE_KEY), imageGalleryItem);
                    intent.putExtras(b);
                    activity.startActivity(intent);
                }
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView title;
        private ImageView img;
        public ViewHolder(View view) {
            super(view);
            title = (TextView)view.findViewById(R.id.title);
            img = (ImageView) view.findViewById(R.id.img);
        }
    }
}
coder
  • 3,195
  • 2
  • 19
  • 28