2017-12-25 16 views
0

私はアンドロイドの新しいコーダーで、私のサーバーとデータベース(mysql)にイメージのリストを取得しようとしていますが、エラーがあり、何が原因か分かりません... エラーです'E/RecyclerView:アダプターは取り付けられていません。レイアウトをスキップして、実行中に誰かが私を助けることができますか?RecyclerView:アダプタが接続されていません。私が実行しているときにレイアウトをスキップ

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

私は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); 
     } 
    } 
} 
+0

チェックあなたの応答が有効であれば/あなたのリストアイテムにデータがあるかどうか – himel

+0

アクティビティコードを入力してください。 –

+0

このリンクをたどることができますhttps://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout –

答えて

0

あなたはできるセットアップあなたのrecyclerViewとデータを受信したときに項目を設定します。

セットアップリサイクルビューのアクティビティコード:

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

非同期タスクに渡すアダプタ:

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

アダプタsetItems方法:

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); 
     } 
    } 
} 
関連する問題