单击标题按钮后获取listview的所有值

时间:2017-02-14 00:15:05

标签: java android listview android-arrayadapter

在我的活动中,我添加了一个标题按钮来保存listview的值,使用EditText并将它们发布到php / mysql Web应用程序。

如果我使用setOnItemClickListener,我可以获取listview的值,但是当我在标题保存按钮上使用setOnClickListener时,我无法遍历listview。

我正在使用自定义数组适配器: -

public class CustomOrderAdaptor extends ArrayAdapter {     int groupid;

ArrayList<OneOrder> records;

Context context;



public CustomOrderAdaptor(Context context, int vg, int id, ArrayList<OneOrder>records) {

    super(context, vg, id, records);

    this.context = context;

    groupid = vg;

    this.records = records;



}



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



    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View itemView = inflater.inflate(groupid, parent, false);

    TextView textName = (TextView) itemView.findViewById(R.id.product_name);
    textName.setText(records.get(position).getproduct_name());

    EditText new_quantity = (EditText) itemView.findViewById(R.id.new_quantity);
    new_quantity.setText(records.get(position).getnew_quantity());

    TextView textOrderitemid = (TextView) itemView.findViewById(R.id.order_item_id);
    textOrderitemid.setText(records.get(position).getorder_item_id());

    TextView textQuantity = (TextView) itemView.findViewById(R.id.quantity);
    textQuantity.setText(records.get(position).getquantity());



    return itemView;

}

}

数据模型: -

public class OneOrder {
private String quantity;
private String new_quantity;
private String product_name;
private String order_item_id;



public void setquantity(String quantity){this.quantity=quantity;}
public void setnew_quantity(String new_quantity){this.new_quantity=new_quantity;}
public void setproduct_name(String product_name){this.product_name=product_name;}
public void setorder_item_id(String order_item_id){this.order_item_id=order_item_id;}



public String getquantity(){return quantity;}
public String getnew_quantity(){return new_quantity;}
public String getproduct_name(){return product_name;}
public String getorder_item_id(){return order_item_id;}

}

我的活动是: -

protected void onCreate(Bundle savedInstanceState) {

    //TODO Auto-generated method stub

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_get_order);

    context = this;

    records = new ArrayList<OneOrder>();

    listOrder = (ListView) findViewById(R.id.order_item_list);

    LayoutInflater inflater = LayoutInflater.from(this);
    View nTop = inflater.inflate(R.layout.activity_get_order_footer, null);
    listOrder.addHeaderView(nTop);


    adapter = new CustomOrderAdaptor(context, R.layout.list_order, R.id.product_name,
            records);


    listOrder.setAdapter(adapter);

    Button mButton = (Button) nTop.findViewById(R.id.button_save);

    mButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            JSONObject order_items = new JSONObject();
            JSONObject sendObject = new JSONObject();
            for (int i=0;i<adapter.getCount();i++){
                JSONObject order_item = new JSONObject();
                OneOrder current_order = (OneOrder) listOrder.getAdapter().getItem(i);
                //OneOrder current_order = (OneOrder) getListView().getItemAtPosition(i);
                try {
                    order_item.put("quantity", current_order.getquantity().toString());
                    order_item.put("new_quantity", current_order.getnew_quantity().toString());
                    order_item.put("order_item_id", current_order.getorder_item_id().toString());
                    order_items.put(String.valueOf(i),order_item);

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

            }
            HttpURLConnection conn = null;
            try {
                Intent i = getIntent(); // gets the previously created intent
                String order_id = i.getStringExtra("order_id");
                sendObject.put("items", order_items.toString());
                sendObject.put("order_id", order_id);
                try {
                    URL url = new URL("http://192.168.0.70/steam_dos/index.php?option=com_steam&section=linen&task=save_order_out");
                    String message = sendObject.toString();

                    conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout( 10000 /*milliseconds*/ );
                    conn.setConnectTimeout( 15000 /* milliseconds */ );
                    conn.setRequestMethod("POST");
                    conn.setDoInput(true);
                    conn.setDoOutput(true);
                    conn.setFixedLengthStreamingMode(message.getBytes().length);

                    //make some HTTP header nicety
                    conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
                    conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");

                    //open
                    conn.connect();

                    //setup send
                    BufferedOutputStream os = new BufferedOutputStream(conn.getOutputStream());
                    os.write(message.getBytes());
                    //clean up
                    os.flush();

                    //do something with response
                    InputStream is = conn.getInputStream();
                }catch (MalformedURLException e) {
                    e.printStackTrace();

                } catch (IOException e) {

                    e.printStackTrace();

                }


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


        }
    });






}

错误在这里: -

 order_item.put("quantity", current_order.getquantity().toString());

错误很简单: -

java.lang.NullPointerException:尝试调用虚拟方法&java; .js。在空对象引用上

视图如下所示: -

Layout view

我在点击保存按钮后尝试保存listview的所有值但是我没有获得带有该代码的listview项目,请问您能解释实现这一目标的最佳方法吗?感谢。

2 个答案:

答案 0 :(得分:0)

通常不建议使用带适配器的编辑文本,原因是滚动时无法处理编辑文本保存。

有两种解决方案。

  1. 用scrollview
  2. 替换listview

    2创建一个变量并在edittext上添加TextWatcher。每当修改edittext时,文本观察者都会检测到更改并覆盖您在其上执行某些操作的变量。

    代码就像 Implementing Text Watcher for EditText

答案 1 :(得分:0)

我的回答可能不是最好的,但这是我为获取列表视图的EditText值而实现的:

mButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            JSONObject order_item = new JSONObject();
            order_items_edited = new JSONObject();
            for (int i = 0; i < listOrder.getCount(); i++) {
                EditText et = (EditText) listOrder.getChildAt(i).findViewById(R.id.new_quantity);
                if (et!=null) {

                    TextView oi = (TextView) listOrder.getChildAt(i).findViewById(R.id.order_item_id);
                    Log.i("dtag", "et is " + String.valueOf(et.getText()));
                    Log.i("dtag", "oi is " + String.valueOf(oi.getText()));
                    try {
                        order_item.put("new_quantity", String.valueOf(et.getText()));
                        order_item.put("order_item_id", String.valueOf(oi.getText()));
                        order_items_edited.put(String.valueOf(i),order_item);

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

我遇到的主要问题是et的null对象,这是有效的,但我没有测试它。

现在它的工作,我将着眼于实施一个更清洁的解决方案。