2016-11-08 13 views
0
でそれを埋める

すべてがデバッグ時に正常に動作しているようだ、私は期待それはロードJSONデータとRecyclerview

E/RecyclerView: No adapter attached; skipping layout 
を与え、私のrecyclerviewに取り込まれないようイムは、JSONレスポンスを取得

どのように私はこれを修正することができますか?

これは私のAPIが

public class CategoryModel { 
    private int id; 
    private String name_en; 
    private String name_ar; 
    private String categoryImage; 

    public int getId() { 
     return id; 
    } 

    public String getName_en() { 
     return name_en; 
    } 

    public String getName_ar() { 
     return name_ar; 
    } 

    public String getCategoryImage() { 
     return categoryImage; 
    } 
} 
ModelClass

{ 
    "list": [ 
     { 
      "id": 1, 
      "name_en": "Project Management", 
      "name_ar": "" 
     }, 
     { 
      "id": 2, 
      "name_en": "Quality Management", 
      "name_ar": "" 
     }, 
     { 
      "id": 3, 
      "name_en": "IT Service Management", 
      "name_ar": "" 
     }, 
     { 
      "id": 4, 
      "name_en": "IT Security", 
      "name_ar": "" 
     }, 
     { 
      "id": 5, 
      "name_en": "IT Audit", 
      "name_ar": "" 
     }, 
     { 
      "id": 6, 
      "name_en": "Operating Systems", 
      "name_ar": "" 
     }, 
     { 
      "id": 7, 
      "name_en": "Networks", 
      "name_ar": "" 
     }, 
     { 
      "id": 8, 
      "name_en": "Virtualization and Cloud", 
      "name_ar": "" 
     }, 
     { 
      "id": 9, 
      "name_en": "Web App and Programming", 
      "name_ar": "" 
     }, 
     { 
      "id": 10, 
      "name_en": "Design an Special Effects", 
      "name_ar": "" 
     }, 
     { 
      "id": 11, 
      "name_en": "Business Productivity Tools", 
      "name_ar": "" 
     }, 
     { 
      "id": 12, 
      "name_en": "Certified Business Professional", 
      "name_ar": "" 
     }, 
     { 
      "id": 13, 
      "name_en": "Diploma Courses", 
      "name_ar": "" 
     } 
    ] 
} 

JSONResponseクラス

public class JSONResponse { 

    private CategoryModel[] list; 

    public CategoryModel[] getCategories() { 
     return list; 
    } 
} 

要求インタフェース

public interface RequestInterface { 

    @GET("projects/newhorizons/api/categories") 
    Call<JSONResponse> getJSON(); 
} 

どのように見えるかです3210

AdapterClass

public class CategoryAdapter extends RecyclerView.Adapter<CategoryView> { 

    private ArrayList<CategoryModel> categoryModels; 

    public CategoryAdapter(ArrayList<CategoryModel> categoryModels) { 
     this.categoryModels = categoryModels; 

} 

    @Override 
    public CategoryView onCreateViewHolder(ViewGroup parent, int viewType) { 
     View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_list_item,parent,false); 
     return new CategoryView(layoutView); 
    } 

    @Override 
    public void onBindViewHolder(CategoryView holder, int position) { 

     //holder.categoryImage.setImageResource(categoryModels.get(position).getCategoryImage()); 
     holder.categoryName.setText(categoryModels.get(position).getName_en()); 
    } 


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

MainActivity

public class MainActivity extends AppCompatActivity { 

    private RecyclerView categoriesView; 
    private ArrayList<CategoryModel> courseCategories; 
    private CategoryAdapter myCategoryAdapter; 

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



     initViews(); 

     CategoryItemDecoration decoration= new CategoryItemDecoration(this,R.dimen.item_offset); 
     categoriesView.addItemDecoration(decoration); 

     //Intent intent = new Intent(this, LoginActivity.class); 
     //startActivity(intent); 



    } 

    private void initViews(){ 

     loadJSON(); 

     categoriesView = (RecyclerView) findViewById(R.id.categories_grid); 
     categoriesView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main,menu); 
     return super.onCreateOptionsMenu(menu); 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     return id == R.id.action_settings || super.onOptionsItemSelected(item); 


    } 

    private void loadJSON(){ 
     OkHttpClient.Builder client = new OkHttpClient.Builder(); 
     client.readTimeout(60, TimeUnit.SECONDS); 
     client.connectTimeout(60, TimeUnit.SECONDS); 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://combal.net") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 
     Call<JSONResponse> call = requestInterface.getJSON(); 
     call.enqueue(new Callback<JSONResponse>() { 

      @Override 
      public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) { 

       int statusCode = response.code(); 

       //relieve the categories here 
       JSONResponse jsonResponse = response.body(); 
       courseCategories = new ArrayList<>(Arrays.asList(jsonResponse.getCategories())); 
       myCategoryAdapter = new CategoryAdapter(courseCategories); 
       categoriesView.setAdapter(myCategoryAdapter); 

      } 

      @Override 
      public void onFailure(Call<JSONResponse> call, Throwable t) { 

       Log.d("Error",t.getMessage()); 

      } 
     }); 

    } 
} 

は、ここに私のCategoryViewクラス

public class CategoryView extends RecyclerView.ViewHolder{ 

     public ImageView categoryImage; 
     public TextView categoryName; 

public CategoryView(View itemView) { 
     super(itemView); 
     categoryImage = (ImageView) itemView.findViewById(R.id.category_image); 
     categoryName = (TextView) itemView.findViewById(R.id.category_name); 

     } 
} 
+0

例外はどこにスローされますか? (スタックトレース、または少なくとも何行目か) – LarsH

+0

** E/RecyclerView:アダプタが接続されていません。レイアウトをスキップする**デバッグ時の情報については、実際にAPIからの応答が得られるのですが、問題はテキストビューの "name_en"を表示できません –

+0

あなたのアダプタでCategoryViewクラスが定義されています – Onkar

答えて

0

backroundのスレッド上で実行されますonResponse()メソッドでは、アダプタを呼び出すあなたのコードです。 UI要素はメインスレッド、つまりUIThread上でのみ実行されます。ここでは、メインスレッドでコールアダプタが必要です。つまり、runOnUIThread(Runnable r)メソッドを使用します。

@Override 
     public void onResponse(Call<JSONResponse> call, 
     Response<JSONResponse> response) { 

      int statusCode = response.code(); 

      //relieve the categories here 
      JSONResponse jsonResponse = response.body(); 
      courseCategories = new ArrayList<>(Arrays.asList(jsonResponse.getCategories())); 

      MyActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
        myCategoryAdapter = new CategoryAdapter(courseCategories); 
      categoriesView.setAdapter(myCategoryAdapter); 

     } 
    }); 
     } 
+0

もっとお分かりいただけますか? –

+0

私はコードを追加することによって修正されました – Onkar

+0

同じ問題がまだそこにありませんでした... –

関連する問題