1

私はvolley投稿要求からjson値を取得しています。これらの値をsetterメソッドを使ってリストに追加します。私は、アダプタonBindViewholder()メソッドで値を取得し、recyclerview結果でそれを表示していた場合、予想通りに表示なっていません。リターラービューでゲッターとセッターが正常に動作しません

コード以下は

はMainActivity.javaでボレー要求と応答からリストに値を追加することを指し、コードの下

private ProductsPojo pojo; 
    public static ProductsAdapter productsAdapter; 
    private List<ProductsPojo> pojoList; 

    pojo = new ProductsPojo(); 
    pojoList = new ArrayList<>(); 

StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
//   Log.d("Appet8","Products response:"+response.toString()); 

       try { 
        JSONObject jsonObject = new JSONObject(response); 
        JSONArray products = jsonObject.getJSONArray("products"); 

        for (int i=0;i<products.length();i++) { 
         JSONObject product_object = products.getJSONObject(i); 
         String name = product_object.getString("name"); 
         String price = product_object.getString("price"); 
         String product_id = product_object.getString("id"); 
         String sessionname = product_object.getString("sessionname"); 
         String image = product_object.getString("image"); 
         String categoryname = product_object.getString("categoryname"); 

         pojo.setName(product_object.getString("name")); 
         pojo.setImage(product_object.getString("image")); 
         pojoList.add(pojo); 

        } 
        productsAdapter = new ProductsAdapter(pojoList,getApplicationContext()); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
//    Toast.makeText(getApplicationContext(),error.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() { 
       // Posting parameters to login url 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("customer_id", customer_id); 
       return params; 
      } 
     }; 

     AppController.getInstance().addToRequestQueue(request,tag_request); 

ProductFragment.javaにrecyclerviewするアダプタを設定することをいう:

コード下
private GridLayoutManager layoutManager; 
private RecyclerView recyclerView; 

recyclerView = (RecyclerView) view.findViewById(R.id.productList); 
    recyclerView.setHasFixedSize(true); 
    layoutManager = new GridLayoutManager(getActivity().getApplicationContext(),3); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(MainActivity.productsAdapter); 

は、値を表示アダプタクラス、ProductsAdapter.javaを指す:

public class ProductsAdapter extends RecyclerView.Adapter<ProductsAdapter.ProductsViewHolder> { 

    private List<ProductsPojo> productList; 
    private Context context; 

    public ProductsAdapter(List<ProductsPojo> productList,Context context) { 
     this.productList=productList; 
     this.context = context; 
    } 

    @Override 
    public ProductsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater. 
       from(parent.getContext()). 
       inflate(R.layout.products_list, parent, false); 
     ProductsViewHolder holder = new ProductsViewHolder(view); 
     return holder; 
    } 

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

     final ProductsPojo pojo = productList.get(position); 
     Log.d("Appet8","Name:"+pojo.getName()); 

     holder.vTitle.setText(pojo.getName()); 

     holder.vTitle.setTypeface(MainActivity.font); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       pojo.setSelected(!pojo.isSelected()); 
       holder.itemView.setBackgroundColor(pojo.isSelected() ? Color.parseColor("#4D79CF08") : Color.parseColor("#2D6F6F6F")); 

       if(pojo.isSelected()) { 
       holder.selected.setVisibility(View.VISIBLE); 
       } else if(!pojo.isSelected()) { 
       holder.selected.setVisibility(View.GONE); 
       } 
      } 
     }); 
    } 

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

    public static class ProductsViewHolder extends RecyclerView.ViewHolder { 

     protected TextView vTitle; 
     protected ImageView image,selected; 
     protected CardView product_card; 

     public ProductsViewHolder(View v) { 
      super(v); 
      vTitle = (TextView) v.findViewById(R.id.title); 
      image = (ImageView) v.findViewById(R.id.product); 
      product_card = (CardView) v.findViewById(R.id.product_card); 
      selected = (ImageView) v.findViewById(R.id.selected); 
     } 
    } 

} 

これは私がボレーリクエストから取得した応答である:

{ 
"products":[ 
     { 
      "name":"Idli", 
      "price":"120", 
      "id":"Fi2mYuQA", 
      "sessionname":"Breakfast", 
      "image":"VCYwmSae2BShoshone_Falls-1200px.jpeg", 
      "categoryname":"Veg" 
     }, 
     { 
      "name":"Meals123", 
      "price":"200", 
      "id":"bmF8Is1Y", 
      "sessionname":"Dinner", 
      "image":"sIe8JBFzaRstock-photo-115193575.jpg", 
      "categoryname":"Non Veg" 
     }, 
     { 
      "name":"Dosa", 
      "price":"100", 
      "id":"e9sWHV4A", 
      "sessionname":"Breakfast", 
      "image":"j8nu4GpVa7Shoshone_Falls-1200px.jpeg", 
      "categoryname":"Veg" 
     }, 
     { 
      "name":"Coca", 
      "price":"40", 
      "id":"0oJDfdCz", 
      "sessionname":"Cold Drinks", 
      "image":"LrkS8QpAs7Shoshone_Falls-1200px.jpeg", 
      "categoryname":"Veg" 
     }, 
     { 
      "name":"ICe", 
      "price":"100", 
      "id":"2ykEgtSs", 
      "sessionname":null, 
      "image":"KtPX9C26oRShoshone_Falls-1200px.jpeg", 
      "categoryname":"Veg" 
     } 
    ] 
} 

This is the output i am getting. Item names are repeated.

これは私が取得しています出力されます。項目名が繰り返されます。コードの下

はProductsPojo.javaを参照:

public class ProductsPojo { 
    public String name; 
    public String image; 
    private boolean isSelected = false; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setSelected(boolean selected) { 
     isSelected = selected; 
    } 


    public boolean isSelected() { 
     return isSelected; 
    } 
} 
+0

オーケーProductsPojo –

答えて

8

あなただけの今までここに1つのProductsPojoインスタンスの作成、のように私には見える:

pojo = new ProductsPojo(); 

をしてからループにあなたはこの1つを変更保ちますインスタンスを作成し、それを繰り返しリストに追加します。この方法では、リスト内の同じアイテム(最後のもの)を、応答に含まれているオブジェクトの数だけ何度でも終了します。

for (int i=0;i<products.length();i++) { 
    ProductsPojo pojo = new ProductsPojo(); 

    JSONObject product_object = products.getJSONObject(i); 
    String name = product_object.getString("name"); 
    String price = product_object.getString("price"); 
    String product_id = product_object.getString("id"); 
    String sessionname = product_object.getString("sessionname"); 
    String image = product_object.getString("image"); 
    String categoryname = product_object.getString("categoryname"); 

    pojo.setName(product_object.getString("name")); 
    pojo.setImage(product_object.getString("image")); 
    pojoList.add(pojo); 
} 
+0

オーケー、これをしようとしますが更新されます:あなたがやりたいこと

は、forループの代わりに、すべての時間は、次のようにの先頭に新しいProductsPojoを作成することはおそらくでした。 –

+0

この回答は完璧に見える –

+1

ありがとうそれは働いた:) –

関連する問題