2017-02-14 6 views
0

В моей деятельности я добавляю кнопку заголовка, чтобы сохранить значения listview с помощью EditText и отправить их в веб-приложение php/mysql.Получить все значения listview после кнопки заголовка нажмите

Я могу получить значения listview, если я использую setOnItemClickListener, но когда я использую setOnClickListener в кнопке сохранения заголовка, я не могу выполнять итерацию через listview.

Я использую адаптер пользовательского массива: -

общественного класса CustomOrderAdaptor расширяет 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.lang.String au.com.southportsteamlaundry.rfid.steamscanadditions.OneOrder.getquantity() на ссылка объект нулевой

мнение выглядит следующим образом: -

Layout view

Я пытаюсь сохранить все значения ListView после нажатия на кнопку сохранения нажата но я не получаю элементы списка с этим кодом, не могли бы вы объяснить лучший способ достичь этого? Благодарю.

+0

Просто сохраните локальную ссылку на ArrayList, которую вы передадите в конструктор пользовательских адаптеров внутри действия владельца. Внутри вашего OnItemClickListener хранятся выбранные индексы внутри логического [], который инициализируется с тем же размером, что и ArrayList. Как только кнопка заголовка выбрана, просто перебирайте булевский массив, а индексы с истинным значением захватите соответствующий индекс внутри ArrayList и сохраните их во временном списке и загрузите в свою базу данных. –

+0

Спасибо Wade. Если я правильно вас понимаю, когда я получаю объект json из веб-приложения php/mysql, я должен сохранить данные в локальном массиве и вытащить значения после нажатия кнопки сохранения? Как получить значения EditTexts, которые находятся в списке, один EditText для каждой строки. – user1911778

+0

явно случай над мышлением java nube. Я получал json-объект от php, мне нужно было объявить, что JsonArray находится в верхней части активности, а затем смог получить к нему доступ и отправить его обратно для обработки. Я переместил HttpURLConnection в задачу async, поскольку он сбой. Мне все еще нужно разобраться, как получить доступ к EditTexts рядом с каждой строкой списка. – user1911778

ответ

0

Обычно не рекомендуется использовать Редактирование текста с адаптером, причина в том, что редактирование текста не может быть обработано при прокрутке.

Существует два варианта решения.

  1. Заменить ListView с Scrollview

2 создать переменную и добавить TextWatcher на EditText. Всякий раз, когда edittext получает изменения, наблюдатель текста обнаруживает изменение и переопределяет переменную, если вы что-то сделали с ней.

код будет как Implementing Text Watcher for EditText

+0

Спасибо TaoBIt, я посмотрю на просмотр прокрутки, хотя я сомневаюсь, что в этом контексте будет прокрутка. Не должно быть слишком много предметов заказа за заказ, и частное приложение будет работать на планшете. Я все еще не знаю из вашего ответа, как я должен получить все значения listview/scrollview или как получить соответствующий EditText для этой строки. – user1911778

+0

Я бы не рекомендовал это, потому что вам нужно было бы сразу загрузить все представления для элементов заказа на экране. Если у вас есть большой список элементов заказа, вы бы не захотели загружать все их виды, так как это приведет к большому объему памяти и будет иметь накладные расходы при начальной загрузке. ListView, в отличие от ScrollView, только рисует представления, которые могут отображаться на экране одновременно, и внутренне имеет довольно сложную логику для обработки видов рециркуляции, которые будут использоваться снова или вверху и внизу списка в зависимости от направления прокрутки, которое значительно экономит Память. –

+0

Да, @Wade Уилсон. Использование прокрутки было бы лучше, если бы вы знали, что данных не так много. В целом, EditText не очень совместим с wth listview/recyclerview, потому что когда строка прокручивается с экрана, данные становятся чистыми. Если вам все равно придется использовать его, я бы рекомендовал использовать Text Watcher в EditText. А также вам нужно быть осторожным, чтобы обрабатывать фокус клавиатуры в EditText в списке viewview/scrollview – TaoBit

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, что действительно, но я не тестировал его.

Теперь его работа, я рассмотрю реализацию более чистого решения.