#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. Вы уведомили его об изменениях? И вы настраиваете список на правильный адаптер? Это обычная процедура, поэтому она должна работать идеально