E:/ RecyclerView:未连接适配器;跳过布局

时间:2018-12-20 12:27:49

标签: android json

我正在通过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);
        }
    }
}

3 个答案:

答案 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时直接或间接使当前布局无效,否则您的回收站布局将不会显示。