У меня проблема с видом и фрагментами ресайклера?

#java #android #json #android-fragments #android-recyclerview

#java #Android #json #android-фрагменты #android-recyclerview

Вопрос:

Я пишу этот код, но ничего мне не показываю, и logcat у меня нет ошибок

и у меня есть три класса для этого кода Adapter recyclertouchlistener и fragments code…

мой код приведен ниже

этот код для фрагмента :

 public class VerticalRecyclerFragment extends Fragment {

RecyclerView rcVertical;
static ArrayList<Products> productsArrayList = new ArrayList<>();

public VerticalRecyclerFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_vertical_recycler,
            container, false);

    showProduct();

    rcVertical = view.findViewById(R.id.rcVertical);
    rcVertical.addOnItemTouchListener(new RecyclerTouchListener(getContext(), rcVertical,
            new RecyclerTouchListener.ClickListener() {
                @Override
                public void onClick(View view, int position) {
                    ProductActivity.products = productsArrayList.get(position);
                    startActivity(new Intent(getActivity(), ProductActivity.class));
                }

                @Override
                public void onLongClick(View view, int position) {
                }
            }));

    Adapter adapter = new Adapter(productsArrayList, getContext());
    rcVertical.setLayoutManager(new LinearLayoutManager(getActivity()));
    rcVertical.setItemAnimator(new DefaultItemAnimator());
    rcVertical.setAdapter(adapter);

    return view;
}

public void showProduct() {
    final ProgressDialog loader = ProgressDialog.show(getActivity(),
            "Get products...", "please wait",
            false, false);
    StringRequest request = new StringRequest(Request.Method.POST,
            Config.getProductsWebApi,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    loader.dismiss();
                    productsArrayList.clear();
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        JSONArray jsonArray = jsonObject.getJSONArray("response");
                        for (int i = 0; i < jsonArray.length(); i  ) {
                            JSONObject object = jsonArray.getJSONObject(i);
                            String id = object.getString("id");
                            String name = object.getString("name");
                            String description = object.getString("description");
                            String price = object.getString("price");
                            String photo = object.getString("photo");
                            Products p = new Products(id, name, description, price, photo);
                            productsArrayList.add(p);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            loader.dismiss();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    requestQueue.add(request);
}}
 

и я пишу этот код для адаптера в одном классе :

 public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder> {

ArrayList<Products> ProductsList;
Context context;

public Adapter(ArrayList<Products> productsList, Context context) {
    ProductsList = productsList;
    this.context = context;
}

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(context).inflate(R.layout.row_layout, parent, false);
    return new MyHolder(v);
}

@Override
public void onBindViewHolder(MyHolder holder, final int position) {
    Products products = ProductsList.get(position);

    holder.txtName.setText(products.getName());
    holder.txtPrice.setText("$ "   products.getPrice());
    Picasso.get().load(Config.ipValue   "/images/"   products.getPhoto()).into(holder.imgV);
    holder.imgV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.startAnimation(AnimationUtils.loadAnimation(context, android
                    .R.anim.slide_in_left));
        }
    });

}

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

class MyHolder extends RecyclerView.ViewHolder {

    TextView txtName;
    TextView txtPrice;
    ImageView imgV;

    public MyHolder(View itemView) {
        super(itemView);

        txtName = itemView.findViewById(R.id.rowTxtProductName);
        txtPrice = itemView.findViewById(R.id.rowTxtPrice);
        imgV = itemView.findViewById(R.id.rowImgProduct);
    }
}}
 

RecyclerTouchListener :

 public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

private GestureDetector gestureDetector;
private ClickListener clickListener;

public RecyclerTouchListener(Context context, final RecyclerView recyclerView,
                             final ClickListener clickListener) {
    this.clickListener = clickListener;
    gestureDetector = new GestureDetector(context,
            new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null amp;amp; clickListener != null) {
                clickListener.onLongClick(child, recyclerView.getChildPosition(child));
            }
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null amp;amp; clickListener != null amp;amp; gestureDetector.onTouchEvent(e)) {
        clickListener.onClick(child,rv.getChildPosition(child));
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

public interface ClickListener {
    void onClick(View view, int position);

    void onLongClick(View view, int position);
}}
 

Пожалуйста, если вы знаете, в чем проблема, помогите мне ее отладить…
Спасибо

Ответ №1:

Вам нужно notifyDataSetChanged() , когда вы получите ответ.

Сделайте адаптер как поле класса

 public class VerticalRecyclerFragment extends Fragment {

    RecyclerView rcVertical;
    static ArrayList<Products> productsArrayList = new ArrayList<>();
    Adapter adapter; // <<< Change here
 

измените инициализацию (и каждый вызов адаптера в поле класса)

 adapter = new Adapter(productsArrayList, getContext()); // <<< Change here
rcVertical.setLayoutManager(new LinearLayoutManager(getActivity()));
rcVertical.setItemAnimator(new DefaultItemAnimator());
rcVertical.setAdapter(adapter);
 

И, наконец, позвоните notifyDataSetChanged() , когда получите ответ

 public void showProduct() {
    final ProgressDialog loader = ProgressDialog.show(getActivity(),
            "Get products...", "please wait",
            false, false);
    StringRequest request = new StringRequest(Request.Method.POST,
            Config.getProductsWebApi,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    loader.dismiss();
                    productsArrayList.clear();
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        JSONArray jsonArray = jsonObject.getJSONArray("response");
                        for (int i = 0; i < jsonArray.length(); i  ) {
                            JSONObject object = jsonArray.getJSONObject(i);
                            String id = object.getString("id");
                            String name = object.getString("name");
                            String description = object.getString("description");
                            String price = object.getString("price");
                            String photo = object.getString("photo");
                            Products p = new Products(id, name, description, price, photo);
                            productsArrayList.add(p);
                        }
                       adapter.notifyDataSetChanged();  // <<< Change here

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }...
        
...
}

 

Обновить:

добавьте присоедините адаптер к RecyclerView когда вы получаете данные

 for (int i = 0; i < jsonArray.length(); i  ) {
    JSONObject object = jsonArray.getJSONObject(i);
    String id = object.getString("id");
    String name = object.getString("name");
    String description = object.getString("description");
    String price = object.getString("price");
    String photo = object.getString("photo");
    Products p = new Products(id, name, description, price, photo);
    productsArrayList.add(p);
}
Adapter adapter = new Adapter(productsArrayList, getContext()); // <<< Change here
rcVertical.setAdapter(adapter);  // <<< Change here
 

Комментарии:

1. @MHmansouri пожалуйста, проверьте UPDATE раздел в ответе.. надеюсь, теперь это работает

2. нет, это не изменится, и я предполагаю, что проблема связана с другим местом спасибо за вашу помощь @Zain