【问题标题】:Custom Listview not showing data自定义列表视图不显示数据
【发布时间】:2017-05-28 16:36:27
【问题描述】:

我的自定义列表视图没有显示任何数据,我尝试重新编码适配器和其他所有内容,但没有骰子。

它甚至没有显示任何错误,这就是让我发疯的原因哈哈。谁能帮我调试我的代码。

这是我的活动:

private ListView listView;


private ArrayList<String> orderName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_orders_page);

    orderName = new ArrayList<>();

    ListView listView = (ListView) findViewById(R.id.listViewOrder);

    viewOrderAdapter adapter = new viewOrderAdapter(viewOrdersPage.this, orderName);
    listView.setAdapter(adapter);

    getBoxInformation();

}

  private void getBoxInformation() {
    final ProgressDialog loading = ProgressDialog.show(this, "GETTING BOX INFROMATION", "Processing Request...", false, false);
    String url = DATA_URL + textUsername.getText().toString().trim();
    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            showJSON(response);
            loading.dismiss();
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(viewOrdersPage.this, error.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
private void showJSON(String response) {
  String name = "";

    try {
        jsonObject = new JSONObject(response);
        result = jsonObject.getJSONArray(JSON_ARRAY);
        order = result.getJSONObject(0);
        name = order.getString(TAG_ORDERNAME);

        JSONArray jsonarray = new JSONArray(name);
        for (int i = 0; i < jsonarray.length(); i++) {
            JSONObject jsonobject = jsonarray.getJSONObject(i);
            names = jsonobject.getString("name");


            //THE TOAST DISPLAYS THE TEXT SO I KNOW THE CODE WORKS, EXCEPT THE LISTVIEW
            Toast.makeText(viewOrdersPage.this, names, Toast.LENGTH_LONG).show();

     orderName.add(names);

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

这是适配器类:

public class viewOrderAdapter extends BaseAdapter {

private Context context;

private ArrayList<String> orderName;


public viewOrderAdapter(Context context, ArrayList<String> orderName){
    this.context = context;
    this.orderName = orderName;

}

@Override
public int getCount() {
    return orderName.size();
}

@Override
public Object getItem(int position) {
    return orderName.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    final View listView;
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    listView = inflater.inflate(R.layout.view_orders_item, null);

    TextView name = (TextView) listView.findViewById(R.id.orderNames);


    name.setText(orderName.get(position));

    return listView;
}

}

提前感谢您的帮助!

【问题讨论】:

    标签: android listview android-arrayadapter android-adapter


    【解决方案1】:

    问题:网络请求需要一些时间,但是当列表中没有数据时您正在创建适配器,因此您需要告诉适配器数据发生了变化

    adapter引用移到onCreate之外

    private ArrayList<String> orderName;
    private viewOrderAdapter adapter ; // adapter reference
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_orders_page);    
        orderName = new ArrayList<>();
        ListView listView = (ListView) findViewById(R.id.listViewOrder);    
        adapter = new viewOrderAdapter(viewOrdersPage.this, orderName);
        listView.setAdapter(adapter);    
        getBoxInformation();
    
    }
    

    然后在showJSON函数末尾添加adapter.notifyDataSetChanged()

    您可以在showJSON函数末尾的listview上创建和设置adapter

    【讨论】:

    • 是的先生您是对的,让我等五分钟接受您的回答哈哈。我想连续 8 小时的编码真的很伤脑筋哈哈。谢谢先生!
    【解决方案2】:

    这是活动:

        private ListView listView;
    
    
        private ArrayList<String> orderName;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_view_orders_page);
    
            orderName = new ArrayList<>();
    
            ListView listView = (ListView) findViewById(R.id.listViewOrder);
    
    
    
            getBoxInformation();
    
        }
    
        private void setDataInList(){
        viewOrderAdapter adapter = new viewOrderAdapter(viewOrdersPage.this, orderName);
            listView.setAdapter(adapter);
        }
    
          private void getBoxInformation() {
            final ProgressDialog loading = ProgressDialog.show(this, "GETTING BOX INFROMATION", "Processing Request...", false, false);
            String url = DATA_URL + textUsername.getText().toString().trim();
            StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    showJSON(response);
                    loading.dismiss();
                }
            },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(viewOrdersPage.this, error.getMessage().toString(), Toast.LENGTH_LONG).show();
                        }
                    });
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);
        }
        private void showJSON(String response) {
          String name = "";
    
            try {
                jsonObject = new JSONObject(response);
                result = jsonObject.getJSONArray(JSON_ARRAY);
                order = result.getJSONObject(0);
                name = order.getString(TAG_ORDERNAME);
    
                JSONArray jsonarray = new JSONArray(name);
                for (int i = 0; i < jsonarray.length(); i++) {
                    JSONObject jsonobject = jsonarray.getJSONObject(i);
                    names = jsonobject.getString("name");
    
    
                    //THE TOAST DISPLAYS THE TEXT SO I KNOW THE CODE WORKS, EXCEPT THE LISTVIEW
                    Toast.makeText(viewOrdersPage.this, names, Toast.LENGTH_LONG).show();
    
             orderName.add(names);
    
                }
    if(orderName.size()>0){
    setDataInList();
    }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    

    这是适配器类:

    public class viewOrderAdapter extends BaseAdapter {
    
    private Context context;
    
    private ArrayList<String> orderName;
    
    
    public viewOrderAdapter(Context context, ArrayList<String> orderName){
        this.context = context;
        this.orderName = orderName;
    
    }
    
    @Override
    public int getCount() {
        return orderName.size();
    }
    
    @Override
    public Object getItem(int position) {
        return orderName.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return 0;
    }
    
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    
        View listView;
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        listView = inflater.inflate(R.layout.view_orders_item, null);
    
        TextView name = (TextView) listView.findViewById(R.id.orderNames);
    
    
        name.setText(orderName.get(position));
    
        return listView;
    }
    

    【讨论】:

    • 嘿先生,我已经得到答案了,我错过了 adapter.notifydatasetchanged 哈哈。无论如何,感谢先生您应得的帮助和支持!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多