RecyclerView不渲染Json数据

时间:2016-02-25 17:08:55

标签: java android android-layout android-recyclerview recycler-adapter

这是我正在开发的Android应用程序的类。 recyclerView可以完美地处理片段,但不适用于活动

public class BillersActivity extends AppCompatActivity {
VolleySingleton volleySingleton;
RequestQueue requestQueue;
private ArrayList<Billers> billersList= new ArrayList<>();
private RecyclerView recyclerView;
private BillersAdaptor billersAdaptor;
Context context;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_billers);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
   getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    overridePendingTransition(R.layout.transition_in, R.layout.transition_out);

    sendJsonRequest();

    recyclerView = (RecyclerView)findViewById(R.id.testbillersListRecyclerView);
    billersAdaptor = new BillersAdaptor(this, billersList);//
    recyclerView.setAdapter(billersAdaptor);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    recyclerView.setHasFixedSize(true);


private void sendJsonRequest() {
    L.m("sending billers request");
    StringRequest activity =new StringRequest(Request.Method.GET, Url.getBillersUrl() ,  new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            billersList = parseJsonResponse(response);
            billersAdaptor.setBillersList(billersList);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyCustomErrorHandler.errorMessage(error);
        }
    });

    requestQueue = volleySingleton.getInstance().getRequestQueue();
    requestQueue.add(activity);
}



private ArrayList<Billers> parseJsonResponse(String response) {

    ArrayList<Billers> billersList = new ArrayList<>();

    if(response !=null||response.length() !=0) {


        try {
            //Creating JsonObject from response String
            JSONObject jsonObject = new JSONObject(response);
            //extracting json array from response string
            JSONArray billersArray = (JSONArray) jsonObject.getJSONArray("response");

            for (int i = 0; i < billersArray.length(); i++) {

                JSONObject jsonRow = billersArray.getJSONObject(i);
                //get value from jsonRow
                String name = (String) jsonRow.get("name");
                String description = (String) jsonRow.get("description");
                Billers billers = new Billers();
                billers.setName(name);
                billers.setDescription(description);

                billersList.add(billers);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    return billersList;
}

}

这是我的适配器

  public class BillersAdaptor extends   RecyclerView.Adapter<BillersAdaptor.ViewHolderBillers>{
private LayoutInflater layoutInflater;
private ArrayList<Billers> billersList = new ArrayList<>();

public BillersAdaptor( Context context, ArrayList<Billers> billersList){
    layoutInflater = LayoutInflater.from(context);
    this.billersList=billersList;
}

public void setBillersList(ArrayList<Billers> billersList){
    this.billersList=billersList;
    notifyItemRangeChanged(0, billersList.size());

}

@Override
public ViewHolderBillers onCreateViewHolder(ViewGroup parent, int viewType) {

    L.m("ayoutInflater.inflate(R.layout.item_billers_list, parent, false);");
    View layout =  layoutInflater.inflate(R.layout.item_billers_list, parent, false);
    ViewHolderBillers viewHolderBillers = new ViewHolderBillers(layout);
    L.m("creating billers");
    return  viewHolderBillers;
}

@Override
public void onBindViewHolder(ViewHolderBillers holder, int position) {
    L.m("Billers current = billersList.get(position)");
    Billers current = billersList.get(position);

    holder.billing_name.setText(current.getName());
    holder.billing_desc.setText(current.getDescription());
    L.m("Binding billers view holders");

}

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


static class ViewHolderBillers extends RecyclerView.ViewHolder{
    private TextView billing_desc;
    private  TextView billing_name;

    public ViewHolderBillers(View itemView) {
        super(itemView);
        L.m("creating billers view holder");
        billing_desc = (TextView) itemView.findViewById(R.id.billing_desc);
        billing_name = (TextView) itemView.findViewById(R.id.billing_name);
    }
}

}

问题是它加载了,我可以记录json响应,但是onCreateViewHolderonBindViewHolder和整个ViewHolder类没有被调用控制台记录。

4 个答案:

答案 0 :(得分:0)

我认为您应该billersAdaptor.notifyDataSetChanged();更新适配器中的项目,并在发生这种情况时使视图无效

答案 1 :(得分:0)

问题是您正在更改活动上ArrayList的引用,这是错误的。您将第一次添加到ArrayList,因为如果您没有这样做,您编辑的对象将与适配器所持有的对象不同。

换句话说,parseJsonResponse不应该创建一个新的ArrayList,它应该添加到旧的ArrayList中。更改后,您应该使用

通知适配器您已更改其基础数据
billersAdaptor.notifyDataSetChanged();

答案 2 :(得分:0)

将youradapter中的setBillersList更改为此

public void setBillersList(ArrayList<Billers> billersList){
    this.billersList.addAll(billersList);//you can even clear before this line
    notifyDataSetChanged();
}

答案 3 :(得分:0)

这是因为您正在呼叫notifyItemRangeChanged()

答案是here

添加一些逻辑来检查更改,插入或删除的内容,并适当地调用其余的“通知”调用。