Я хочу, чтобы данные были извлечены и установлены для просмотра карт с использованием библиотеки залпа - PullRequest
0 голосов
/ 11 июня 2019

Данные извлекаются без каких-либо проблем. Но я хочу, чтобы эти данные были установлены для карт.Когда я пытаюсь выполнить приведенный ниже код, « Попытка вызвать виртуальный метод int java.util.ArrayList.size () для нулевой ссылки на объект » в классе CustomAdapter является ошибкой, с которой я сталкиваюсь.Мой код:

MainActivity.java

 public class MainActivity extends AppCompatActivity {
 RecyclerView recyclerView;
 CustomAdapter customAdapter;
 ArrayList<ProductsData> arrayList;
 ProgressDialog progressDialog;

String url = "url";

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

    recyclerView = findViewById(R.id.recyclerView);

    setUpRecycler();

    getData();
}

private void getData() {

    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading...");
    progressDialog.show();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            Log.d("result here","result here"+response);


            try {
                progressDialog.dismiss();

                JSONObject jsonObject = new JSONObject(response);

                arrayList = new ArrayList<>();
                JSONArray jsonArray = jsonObject.getJSONArray("products");
                for (int i = 0; i <= jsonArray.length();i++)
                {
                    ProductsData productsData = new ProductsData();
                    JSONObject obj = jsonArray.getJSONObject(i);

                    productsData.setProductImage(obj.getInt("image"));
                    productsData.setProductTitle(obj.getString("name"));
                    productsData.setProductPrice(obj.getString("price"));

                    arrayList.add(productsData);
                }

                setUpRecycler();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, ""+error.toString(), Toast.LENGTH_SHORT).show();
        }
    }
    )
    {
        @Override
        public Map<String,String> getHeaders() throws AuthFailureError {
            Map<String,String>  params = new HashMap<>();
            params.put("Authorization", "1234567890");
            return params;
        }
    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

private void setUpRecycler() {
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(),2));
    customAdapter = new CustomAdapter(this,arrayList);
    recyclerView.setAdapter(customAdapter);

}

}

CustomAdapter.java

 class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

private Context context;
private ArrayList<ProductsData> arrayList;

public CustomAdapter(Context context, ArrayList<ProductsData> arrayList) {

    this.context= context;
    this.arrayList = arrayList;

}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v  = LayoutInflater.from(context).inflate(R.layout.cardviewforproducts,viewGroup,false);
    MyViewHolder holder = new MyViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

    myViewHolder.productImage.setImageResource(arrayList.get(i).getProductImage());
    myViewHolder.productName.setText(arrayList.get(i).getProductTitle());
    myViewHolder.productPrice.setText(arrayList.get(i).getProductPrice());

}

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

public class MyViewHolder extends RecyclerView.ViewHolder
{
    ImageView productImage;
    TextView productName;
    TextView productPrice;

    public MyViewHolder(@NonNull View itemView) {

        super(itemView);
        productImage = itemView.findViewById(R.id.productImage);
        productName = itemView.findViewById(R.id.productName);
        productPrice = itemView.findViewById(R.id.productPrice);

    }
}
}

ProductsData.java

public class ProductsData {

private int productImage;
private String productTitle,productPrice;


public int getProductImage() {
    return productImage;
}

public void setProductImage(int productImage) {
    this.productImage = productImage;
}

public String getProductTitle() {
    return productTitle;
}

public void setProductTitle(String productTitle) {
    this.productTitle = productTitle;
}

public String getProductPrice() {
    return productPrice;
}

public void setProductPrice(String productPrice) {
    this.productPrice = productPrice;
}
}

activitymain.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>
</android.support.constraint.ConstraintLayout>

cardviewforproducts.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:elevation="3dp"
    app:cardElevation="4dp"
    app:cardCornerRadius="1dp"
    app:cardUseCompatPadding="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="8dp">

        <ImageView
            android:id="@+id/productImage"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            />

        <TextView
            android:id="@+id/productName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Apple MacBook Air Core i5 5th Gen - (8 GB/128 GB 
  SSD/Mac OS Sierra)"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/productPrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:textStyle="bold" />

    </LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

Я ожидаю, что в найденных продуктах должно быть установлено количество просмотров карт.

Но возникает ошибка Попытка вызова виртуального метода 'int java.util.ArrayList.size () 'для ссылки на пустой объект

Ответы [ 3 ]

0 голосов
/ 11 июня 2019

Удалить setUpRecycler(); из OnCreate()

Так что ваш onCreate () будет выглядеть следующим образом

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

    recyclerView = findViewById(R.id.recyclerView);
    getData();
}

Проблема возникает из-за того, что вы инициализируете arraylist в getData() и вызываетеsetUpRecycler() до getData(), поэтому на данный момент arraylist не инициализирован.

0 голосов
/ 11 июня 2019

Вам необходимо иметь notifyDataSetChanged внутри getData () метод для вашего customAdapter .Поскольку вы настраиваете нулевой адаптер в setUpRecycler () , вам нужно вызвать его.

Измените свой метод getData () какниже.Вам не нужно снова вызывать setUpRecycler () внутри этого метода.

Также переместите это arrayList = new ArrayList<>(); в setUpRecycler () , так как это нужно вызывать только один раз,

private void getData() {

    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading...");
    progressDialog.show();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            Log.d("result here","result here"+response);


            try {
                progressDialog.dismiss();

                JSONObject jsonObject = new JSONObject(response);

                JSONArray jsonArray = jsonObject.getJSONArray("products");
                for (int i = 0; i <= jsonArray.length();i++)
                {
                    ProductsData productsData = new ProductsData();
                    JSONObject obj = jsonArray.getJSONObject(i);

                    productsData.setProductImage(obj.getInt("image"));
                    productsData.setProductTitle(obj.getString("name"));
                    productsData.setProductPrice(obj.getString("price"));

                    arrayList.add(productsData);
                }

                customAdapter.notifyDataSetChanged();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, ""+error.toString(), Toast.LENGTH_SHORT).show();
        }
    }
    )
    {
        @Override
        public Map<String,String> getHeaders() throws AuthFailureError {
            Map<String,String>  params = new HashMap<>();
            params.put("Authorization", "1234567890");
            return params;
        }
    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

Также измените ваш метод setUpRecycler () следующим образом.

private void setUpRecycler() {
    arrayList = new ArrayList<>();
    recyclerView = findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(),2));
    recyclerView.setHasFixedSize(true);
    customAdapter = new CustomAdapter(this,arrayList);
    recyclerView.setAdapter(customAdapter);

}
0 голосов
/ 11 июня 2019

Вам нужно инициализировать список массивов глобально

ArrayList<ProductsData> arrayList = new ArrayList<>();
...