Tengo un ListView con un cliente ArrayAdapter y una costumbre ListItem-XML. En la parte inferior de esta ListView he añadido un FooterView con un Botón. Ahora quiero obtener todos los valores de las tres EditTexts en cada uno de mis ListItems cuando hago clic en este Botón.

Aquí abajo es mi código:

activity_checklistresult.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

result_inner_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center">

    <TextView
        android:id="@+id/tv_result_amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin" />
    <EditText
        android:id="@+id/et_result_amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin"
        android:inputType="number" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_result_product_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:ellipsize="end"
            android:layout_margin="@dimen/default_margin" />
        <AutoCompleteTextView
            android:id="@+id/actv_search_product"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:singleLine="true"
            android:ellipsize="end"
            android:layout_margin="@dimen/default_margin"
            android:inputType="textAutoComplete" />

    </LinearLayout>

    <TextView
        android:id="@+id/tv_result_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin" />
    <EditText
        android:id="@+id/et_result_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin"
        android:inputType="numberDecimal" />

</LinearLayout>

ResultListActivity.java:

public class ChecklistResultActivity extends ListActivity
{
    private MyResultAdapter adapt;
    private Button confirmButton;
    private ChecklistResultActivity rActivity;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_checklistresult);

        //Set my Custom ArrayAdapter for this ListActivity
        setAdapter();

        rActivity = this;
    }

    private void setAdapter(){
        adapt = new MyResultAdapter(this, R.layout.result_inner_view, Controller.getInstance().getOrderedProducts());
        setListAdapter(adapt);

        //Add the confirm button at the end of the list
        addFooterConfirmButton();
    }

    private void addFooterConfirmButton(){
        ListView lv = (ListView)findViewById(android.R.id.list);
        FrameLayout footerLayout = (FrameLayout) getLayoutInflater().inflate(R.layout.result_footer_view, null);
        confirmButton = (Button)footerLayout.findViewById(R.id.confirm_result_button);
        confirmButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ...

                //Get all EditText values (and compare them with the Default Value)
            }
        });
        lv.addFooterView(footerLayout);
    }

    ...

MyResultAdapter.java:

public class MyResultAdapter extends ArrayAdapter<OrderedProduct>
{
    private Context context;
    private int layoutResourceId;
    private LayoutInflater inflater;

    public MyResultAdapter(Context c, int layoutResourceId, List<OrderedProduct> objects){
        super(c, layoutResourceId, objects);
        this.layoutResourceId = layoutResourceId;
        this.context = c;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = convertView;
        if(view == null)
            view = inflater.inflate(layoutResourceId, parent, false);

        ...

        return view;
    }
}

En el ResultListActivity en //Get all EditText values (and compare them with the Default Value) quiero bucle a través de todos los OrderedProducts y comparar los valores predeterminados de aquellos, con el nuevo relleno en los valores de los dos EditTexts y la AutoCompleteTextView. Así que ¿cómo puedo obtener esos valores dentro de la onClick del Pie de página-Botón?

Gracias de antemano por las respuestas.

  • Lo que está sucediendo ahora? Está usted recibiendo sólo el último valor?
  • el uso de edición de texto cambio de escucha en la edición de texto que se introduzca el valor en la edición de texto en ese momento guardar el valor en objeto de acuerdo a la posición después de que usted puede obtener todos los valores de ese objeto.

2 Comentarios

  1. 13

    Su adaptador para guardar texto en cambio para cada uno creado EditText :

    1. crear un mapa para guardar los valores de
    2. Definir y establecer un genérico TextWatcher para cada EditText
    3. establecer una Etiqueta en el editText (a través de su posición o de cualquier
      id desea) vamos a utilizar esta etiqueta, como la clave en el hashMap
    4. crear un método para recuperar el valor de un determinado EditText

    Adaptador :

    public class MyResultAdapter extends ArrayAdapter<OrderedProduct>
    {
    ...
    private HashMap<String, String> textValues = new HashMap<String, String>();
    ...
    public ViewView getView(int position, View convertView, ViewGroup parent){
    View view = convertView;
    boolean convertViewWasNull = false;
    if(view == null){
    view = inflater.inflate(layoutResourceId, parent, false);
    convertViewWasNull = true;
    }
    myEditText1 = findViewById...
    myEditText2 = findViewById...
    if(convertViewWasNull ){
    //be aware that you shouldn't do this for each call on getView, just once by listItem when convertView is null
    myEditText1.addTextChangedListener(new GenericTextWatcher(myEditText1));
    myEditText2.addTextChangedListener(new GenericTextWatcher(myEditText2));
    }
    //whereas, this should be called on each getView call, to update view tags.
    myEditText1.setTag("theFirstEditTextAtPos:"+position);
    myEditText2.setTag("theSecondEditTextAtPos:"+position);
    }
    private class GenericTextWatcher implements TextWatcher{
    private View view;
    private GenericTextWatcher(View view) {
    this.view = view;
    }
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    public void afterTextChanged(Editable editable) {
    String text = editable.toString();
    //save the value for the given tag :
    MyResultAdapter.this.textValues.put(view.getTag(), editable.toString());
    }
    }
    //you can implement a method like this one for each EditText with the list position as parameter :
    public String getValueFromFirstEditText(int position){
    //here you need to recreate the id for the first editText
    String result = textValues.get("theFirstEditTextAtPos:"+position);
    if(result ==null)
    result = "default value";
    return result;
    }
    public String getValueFromSecondEditText(int position){
    //here you need to recreate the id for the second editText
    String result = textValues.get("theSecondEditTextAtPos:"+position);
    if(result ==null)
    result = "default value";
    return result;
    }
    }
    • A pesar de que he cambiado algunas cosas pequeñas para que sea más dinámico (como sólo una getValueOfEditText método con una Cadena como parámetro y tal), este hecho solucionar mi problema. Gracias y aceptado como respuesta.
    • Cita: «//tenga en cuenta que usted no debe hacer esto para cada llamada en getView, sólo una vez por listItem cuando convertView es nulo» me acabo de enterar de que esto no es cierto, también debe llamar a esto cuando se está desplazando hacia arriba o hacia abajo en el ListView, ya que de esta manera se restablece a los valores guardados de la EditTexts a sus valores predeterminados.
  2. 4

    Usted puede almacenar todos los edittext valores y llegar a ellos cuando sea necesario, se pueden almacenar en afterTextChange o onTextChange, le toca a usted.

    public class MyResultAdapter extends ArrayAdapter<OrderedProduct>{
    ...
    private final String[] valueList;
    public MyResultAdapter(Context c, int layoutResourceId, List<OrderedProduct> objects){
    super(c, layoutResourceId, objects);
    ...
    valueList = new String[objects.size()];
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
    View view = convertView;
    if(view == null)
    view = inflater.inflate(layoutResourceId, parent, false);
    ...
    //for edittext add text watcher listener
    final pos = position;
    editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    valueList[pos] = s.toString();
    }
    @Override
    public void afterTextChanged(Editable s) {
    }
    });
    return view;
    }
    public String[] getValueList(){
    return valueList;
    }
    }
    • ¿Cómo se puede gestionar varios EditText en la misma línea ? en el caso de que tengas uno solo. Además, tenga cuidado de que una llamada ‘nueva TextWatcher()’ en cada ‘getView’ llamada, que puede ser muy pesado y es muy malo para la lista de actuaciones.
    • este es un ejemplo para que el usuario entienda el enfoque, no es totalmente respuesta, por supuesto, el resto depende de él para ajustar su propia aplicación y no estoy de acuerdo con el punto de rendimiento. Listview ya es reciclar y manejar los problemas de rentabilidad. Y lo que el problema de rendimiento de qué piensa usted que puede causar?
    • Se están creando muchas nuevas TextWatcher incluso cuando no sea necesario ya que usted tiene un convertView ya con un conjunto de TextWatcher para su reutilización.
    • Veo tu punto, pero como dije yo solo te estoy dando un enfoque y se trata de cómo usted puede tener un detector para ver. Yo no implementar el código de todos los etc y ninguna intención de hacer eso. este inicializar es cuando su convertview es nulo. Usted puede tener el titular de patrón para mantener referencia, etc, etc. Pero todo esto al usuario poner en práctica.

Dejar respuesta

Please enter your comment!
Please enter your name here