我正在通过JSON解析从API检索数据,并显示为recyclerview
,每当我进行API调用时,logcat中都会发生错误:"E/RecyclerView: No adapter attached; skipping layout"
当我在自己的应用程序中运行我的应用程序时物理设备,但是当我在模拟器上运行我的应用程序时,它对我来说运行正常,那么这是什么问题或原因呢?请帮忙!
这是我的代码:
private void showData() {
showDialog();
tenderList = new ArrayList<>();
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for (int i = 0; i < jsonArray.length(); i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
tenderList.add(new Tender(
jsonObject.getInt("tender_id"),
jsonObject.getString("trnumber"),
jsonObject.getString("nameofwork"),
jsonObject.getString("estimate_value"),
jsonObject.getString("city"),
jsonObject.getString("state"),
jsonObject.getString("closing_date")
));
Log.d(String.valueOf(getContext()),String.valueOf(jsonObject.getInt("tender_id")));
}
final TenderAdapter tenderAdapter = new TenderAdapter(getContext(),tenderList);
recyclerView.setAdapter(tenderAdapter);
} catch (JSONException e) {
e.printStackTrace();
Log.d(String.valueOf(getContext()),e.getMessage());
}
dismissDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String e = error.getMessage();
Log.d(String.valueOf(getContext()),e == null ?"":e);
dismissDialog();
}
});
Volley.newRequestQueue(getContext()).add(stringRequest);
}
片段代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_live_tender,container,false);
recyclerView = view.findViewById(R.id.recycleView);
progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Please Wait...");
progressDialog.setCancelable(false);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
showData();
return view;
}
TenderAdapter
public class TenderAdapter extends RecyclerView.Adapter<TenderAdapter.TenderViewHolder> {
private List<Tender> tenderList;
private Context context;
public TenderAdapter(Context context,List<Tender> tenderList) {
this.tenderList = tenderList;
this.context = context;
}
@NonNull
@Override
public TenderViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.search_tender_list,null);
return new TenderViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TenderViewHolder tenderViewHolder, int i) {
Tender tender = tenderList.get(i);
tenderViewHolder.trno.setText(tender.getTrNo());
tenderViewHolder.tenderDetails.setText(tender.getTenderDetails());
tenderViewHolder.tenderVal.setText(tender.getTenderValue());
tenderViewHolder.city.setText(tender.getCity());
tenderViewHolder.state.setText(tender.getState());
tenderViewHolder.closingDate.setText((CharSequence) tender.getClosingDate());
tenderViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context,DetailListingActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return tenderList.size();
}
public class TenderViewHolder extends RecyclerView.ViewHolder {
TextView trno,tenderDetails,tenderVal,city,state,closingDate;
public TenderViewHolder(@NonNull View itemView) {
super(itemView);
trno = itemView.findViewById(R.id.tvTrNo);
tenderDetails = itemView.findViewById(R.id.tvTenderDetails);
tenderVal = itemView.findViewById(R.id.tvTenderValue);
city = itemView.findViewById(R.id.tvCity);
state = itemView.findViewById(R.id.tvState);
closingDate = itemView.findViewById(R.id.tvClosingDate);
}
}
}
答案 0 :(得分:0)
检查以下内容
->清单中的Internet权限
->您是在
onResponse
还是onError
中获取日志数据-> wifi /数据是否打开
答案 1 :(得分:0)
创建适配器的全局对象,在 onCreate 中初始化并将其分配给recylerview。 不要在API响应中分配适配器。 只需更改一些代码, 在具有上下文的适配器中创建构造函数,
public TenderAdapter(Context mContext) {
this.mContext = mContext;
}
不要在构造函数中传递arraylist, 只需在适配器上创建一个方法,
public void addData(ArrayList<Tender> items) {
this.arrayList = items;
notifyDataSetChanged();
}
然后从您的API响应中调用此方法。
adapter.addData(tenderList)
答案 2 :(得分:0)
您没有在 onCreateView()方法中附加适配器,而是在您的 showData()方法中实现了适配器,该方法需要一些响应,实际上,您是在进行网络通话。如果一切正常,则此网络调用很可能在网络线程上发生,并且是异步的,因为android不允许在主线程中进行长时间操作。
我的意思是,程序控件没有等待您的 showData()方法完成,并且 onCreateView()首先完成了。
这就是为什么您收到适配器未连接错误
的原因更新 该错误不会影响性能,但是如果您确实希望将其从日志中删除,则可以按照以下步骤操作
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
在您的onCreateView()方法中执行上述操作。而且,您可以使用设置器来分隔设置列表的逻辑。
adapter.setYourList(yourList)
只需确保在调用此setter时直接或间接使当前布局无效,否则您的回收站布局将不会显示。