создать представление переработчика во фрагменте?

#java #android #sqlite #android-studio #fragment

#java #Android #sqlite #android-studio #фрагмент

Вопрос:

я хочу создать фрагмент и иметь внутри представление переработчика для показа продуктов…
но когда я визуализирую, отображается эта ошибка: RecyclerView: адаптер не подключен; пропуск макета

ниже я копирую свои коды;

этот код предназначен для класса адаптера :

  private ArrayList<Products> ProductsList;
private 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);
    }
}
 

и это для класса web api :

 public class WebApiHandler {

Context context;
String apiLink = "";
ArrayList<Products> products = new ArrayList<>();

public WebApiHandler(Context context) {
    this.context = context;
}

void apiConnect(String type) {
    switch (type) {
        case "getproducts": {
            apiLink = Config.getProductsWebApi;
            break;
        }
    }

    ProgressDialog dialog = ProgressDialog.show(context, "Connecting...",
            "please wait", false, false);
    StringRequest request = new StringRequest(Request.Method.POST,
            apiLink, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            dialog.dismiss();
            showJson(response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            dialog.dismiss();
        }
    });
    RequestQueue queue = Volley.newRequestQueue(context);
    queue.add(request);
}

private void showJson(String response) {
    products.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);
            products.add(p);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    VerticalFragment.productsArrayList = products;
    IData iData = (IData) context;
    iData.sendData();
}}
 

и мой фрагмент кода :

 public class VerticalFragment extends Fragment implements IData {

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

public VerticalFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_vertical, container, false);
    rcVertical = view.findViewById(R.id.rcVertical);
    webApiHandler = new WebApiHandler(getContext());
    webApiHandler.apiConnect("getproducts");
    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(getContext(), ProductActivity.class));
                }

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

                }
            }));

    return view;
}

@Override
public void sendData() {
    Adapter adapter = new Adapter(productsArrayList, getContext());
    rcVertical.setLayoutManager(new LinearLayoutManager((getContext())));
    rcVertical.setItemAnimator(new DefaultItemAnimator());
    rcVertical.setAdapter(adapter);
}}
 

я должен сказать, что я создаю интерфейс и у меня есть один метод, я говорю, что это sendData

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

1. вы не вызываете функцию sendData , явно вызываете ее OnCreateView после инициализации rcVertical

2. @rcs прав. Вызов функции

3. Не волнуйтесь об ошибке его андроидов, она будет существовать до тех пор, пока вы не установите adapter значение RecyclerView , после установки adapter оно исчезнет.

4. Я реализую интерфейс IData, но он не работает…

5. Вы вызываете его в контексте, а не во фрагменте. Кроме того, почему вы приняли ответ, который не решает вашу проблему?

Ответ №1:

Это распространенная ошибка, когда к recyclerview не подключен адаптер при отображении recyclerview. Это не причинит никакого вреда вашему приложению, но вы можете избежать этого, установив пустой адаптер без данных, а позже, когда вы получите свои данные, предоставьте их своему адаптеру и уведомите его

Редактировать — добавлен пример

Создайте сеттер для вашего списка в адаптере. После этого в вашем фрагменте сделайте адаптер глобальным, а в onCreateView создайте экземпляр вашего адаптера и прикрепите его к recyclerview

 adapter = new Adapter(new ArrayList<>(), getContext());
rcVertical.setAdapter(adapter);
...Initialize recyclerview...
 

А затем в вашем интерфейсе sendData поместите в него загруженные значения

 adapter.setData(productsArrayList);
adapter.notifyDataSetChanged();
 
 

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

1. Отредактировал мой комментарий

2. Почему бы и нет? Создать сеттер для списка продуктов в адаптере

3. Вы уведомили его об изменениях? И вы настраиваете список на правильный адаптер? Это обычная процедура, поэтому она должна работать идеально