发出在动态列表中的元素中输入数据

时间:2015-02-23 15:38:41

标签: android android-listview

在我开发的Android应用中,我正在加载一些项目列表,供用户输入一些数据;每个项目都有一个复选框和一个EditText,用户可以选中复选框并输入有关该项目的一些注释。此列表从本地数据库动态加载,而本地数据库又从前一点的远程数据库填充。现在,我遇到的问题是,每当我专注于EditText时,在我失去对元素的关注之后,列表似乎再次加载(原来未经检查/空白且已经检查/已输入文本的元素在它们中再次取消选中/空白,那些被检查/有文本的内容最初会恢复到原始状态)。只有当我失去对EditText的关注时才会发生这种情况;我可以选中并取消选中复选框,它们会保留我的离开方式(直到我得到并失去对EditText的关注)。我怎样才能避免这种情况,以便我的元素保留数据?

我已经使用Android版本3.2和4.2测试了应用程序

任何帮助都将不胜感激。

这是加载列表的活动:

public class PostventaPreentregaDetalleActivity extends Activity implements OnItemClickListener, OnItemSelectedListener {

    private ArrayList<EncuestaPostventa> listaChequeoEncuesta;
    private ArrayList<ConsumoBien> listaConsumoBien;

    private ListView lvChequeoEncuesta;
    private ListView lvConsumoBien;

    private EncuestaPostventaAdapter adapter;
    private ConsumoBienAdapter adapterConsumoBien;

    public static DBProvider oDB;

    @Override
    public void onBackPressed() {
    }

    public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.postventa_preentrega_detalle_activity_actions, menu);

        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getActionBar().setDisplayHomeAsUpEnabled(true);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_postventa_preentrega_detalle);

        listaChequeoEncuesta = new ArrayList<EncuestaPostventa>();
        listaConsumoBien = new ArrayList<ConsumoBien>();

        inicializarPestanas();
        cargarDetalleNegocio();

        listarChequeoEncuesta();
        listarConsumoBien();

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void onItemClick(AdapterView<?> adapter, View view, int position,
        long ID) {

    }

    public void cargarDetalleNegocio(){
        Intent intent = getIntent();

        TextView tvProyecto;
        TextView tvCliente;
        TextView tvRut;
        TextView tvDireccion;

        tvProyecto = (TextView) findViewById(R.id.tvProyecto);
        tvRut = (TextView) findViewById(R.id.tvRut);
        tvCliente = (TextView) findViewById(R.id.tvCliente);
        tvDireccion = (TextView) findViewById(R.id.tvDireccion);

        tvProyecto.setText(intent.getStringExtra("proyecto").trim());
        tvRut.setText(intent.getStringExtra("rut").trim());
        tvCliente.setText(intent.getStringExtra("cliente").trim());
        tvDireccion.setText(intent.getStringExtra("direccion").trim());
    }

    public void inicializarPestanas(){
        TabHost tabs = (TabHost)findViewById(android.R.id.tabhost);
        tabs.setup();

        TabHost.TabSpec spec = tabs.newTabSpec("tabChequeo");
        spec.setContent(R.id.tabChequeo);
        spec.setIndicator("Chequeo");
        tabs.addTab(spec);

        spec = tabs.newTabSpec("tabServicios");
        spec.setContent(R.id.tabServicios);
        spec.setIndicator("Servicios consumidos");
        tabs.addTab(spec);

        spec = tabs.newTabSpec("tabObservaciones");
        spec.setContent(R.id.tabObservaciones);
        spec.setIndicator("Observaciones");
        tabs.addTab(spec);

        tabs.setCurrentTab(0);

    }

    public void listarChequeoEncuesta(){
        try{
            oDB = new DBProvider(this);

            Intent intent = getIntent();

            int idBien = intent.getIntExtra("id_bien", 0);
            int idEncuestaPreentrega = intent.getIntExtra("id_encuestapreentrega", 0);

            String[][] arrayChequeoEncuesta = oDB.traerEncuestaPostventa(idBien,
            idEncuestaPreentrega);

            if(!(arrayChequeoEncuesta == null)){

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

                    int idEncuestaPostventa = Integer.parseInt(arrayChequeoEncuesta[i][0]);
                int idEncuestaDetalle = Integer.parseInt(arrayChequeoEncuesta[i][1]);

                    String item = arrayChequeoEncuesta[i][2];
                Boolean recepcion = (Integer.parseInt(arrayChequeoEncuesta[i][3]) != 0);
                    String observacion =arrayChequeoEncuesta[i][4];

                    listaChequeoEncuesta.add(new EncuestaPostventa(idEncuestaPostventa,
                    idEncuestaDetalle,
                    item,
                    recepcion,
                    observacion));
                }
            }

            adapter = new EncuestaPostventaAdapter(this, listaChequeoEncuesta);

            lvChequeoEncuesta = (ListView) findViewById(R.id.lvChequeoEncuesta);
            lvChequeoEncuesta.setAdapter(adapter);
        }catch(Exception e){
            Toast.makeText(this, "Error (listarChequeoEncuesta): " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    public void listarConsumoBien(){
        try{
            oDB = new DBProvider(this);

            Intent intent = getIntent();

            int argIdBien = intent.getIntExtra("id_bien", 0);
            int argIdEmpsa = intent.getIntExtra("id_empsa", 0);

            String[][] arrayConsumoBien = oDB.traerConsumoBien(argIdBien,
            argIdEmpsa);

            if(!(arrayConsumoBien == null)){
                for(int i=0; i<arrayConsumoBien.length; i++){

                    int idConsumoBien = Integer.parseInt(arrayConsumoBien[i][0]);
                    int idBien = Integer.parseInt(arrayConsumoBien[i][1]);

                    int idDominio = Integer.parseInt(arrayConsumoBien[i][2]);

                    String nombre = arrayConsumoBien[i][3];
                    String unidad = arrayConsumoBien[i][4];
                    int cantidad = Integer.parseInt(arrayConsumoBien[i][5]);
                    Boolean estado = (Integer.parseInt(arrayConsumoBien[i][6]) != 0);

                    listaConsumoBien.add(new ConsumoBien(idConsumoBien,
                        idBien,
                        idDominio,
                        nombre,
                        unidad,
                        cantidad,
                        estado));
                }
            }

            adapterConsumoBien = new ConsumoBienAdapter(this, listaConsumoBien);

            lvConsumoBien = (ListView) findViewById(R.id.lvConsumoBien);
            lvConsumoBien.setAdapter(adapterConsumoBien);
        }catch(Exception e){
            Toast.makeText(this, "Error (listarConsumoBien): " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    {
    }

    public void onNothingSelected(AdapterView<?> parent)
    {
    }

}

其布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:parentActivityName="net.gestionwireless.officemovil.inmobiliario.PostventaPreentregaActivity">

    <TabHost android:id="@android:id/tabhost"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvLabelProyecto"
                android:text="@string/proyecto"
                android:layout_alignParentLeft="true" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvProyecto"
                android:text=""
                android:layout_toRightOf="@id/tvLabelProyecto" />

            <TextView
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvLabelRut"
                android:layout_below="@id/tvLabelProyecto"
                android:text="@string/rut"
                android:layout_alignParentLeft="true" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvRut"
                android:text=""
                android:layout_toRightOf="@id/tvLabelRut"
                android:layout_below="@id/tvProyecto" />

            <TextView
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvLabelCliente"
                android:layout_marginLeft="50dp"
                android:layout_below="@id/tvLabelProyecto"
                android:layout_toRightOf="@id/tvRut"
                android:text="@string/cliente" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvCliente"
                android:text=""
                android:layout_toRightOf="@id/tvLabelCliente"
                android:layout_below="@id/tvProyecto" />

            <TextView
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvLabelDireccion"
                android:layout_below="@id/tvCliente"
                android:text="@string/direccion"
                android:layout_alignParentLeft="true" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/texto_L"
                android:id="@+id/tvDireccion"
                android:text=""
                android:layout_toRightOf="@id/tvLabelDireccion"
                android:layout_below="@id/tvCliente" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/tvDireccion">

            <TabWidget android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@android:id/tabs" />

            <FrameLayout android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@android:id/tabcontent">

                <LinearLayout
                    android:id="@+id/tabChequeo"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <LinearLayout
                        android:orientation="horizontal"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        android:layout_marginBottom="10dp">

                        <TextView
                            android:text="@string/titulo_grilla_item"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".33"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                        <TextView
                            android:text="@string/titulo_grilla_recepcion"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".1"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                        <TextView
                            android:text="@string/titulo_grilla_observacion"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".57"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                    </LinearLayout>

                    <ListView
                        android:id="@+id/lvChequeoEncuesta"
                        android:layout_width="match_parent"
                        android:layout_height="0dip"
                        android:layout_weight="1">
                    </ListView>

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tabServicios"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <LinearLayout
                        android:orientation="horizontal"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        android:layout_marginBottom="10dp">

                        <TextView
                            android:text="@string/titulo_grilla_servicio"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".4"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                        <TextView
                            android:text="@string/titulo_grilla_recepcion"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".1"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                        <TextView
                            android:text="@string/titulo_grilla_consumo"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".3"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                        <TextView
                            android:text="@string/titulo_grilla_unidad"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight=".2"
                            android:gravity="center"
                            android:textSize="@dimen/titulo_grilla"
                            android:textStyle="bold" />

                    </LinearLayout>

                    <ListView
                        android:id="@+id/lvConsumoBien"
                        android:layout_width="match_parent"
                        android:layout_height="0dip"
                        android:layout_weight="1">
                    </ListView>

                </LinearLayout>

                <LinearLayout android:id="@+id/tabObservaciones"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <EditText
                        android:id="@+id/etObservaciones"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:hint="@string/hint_observaciones" />
                </LinearLayout>

                </FrameLayout>
            </LinearLayout>
        </RelativeLayout>
    </TabHost>
</LinearLayout>

每个项目的课程:

package net.gestionwireless.officemovil.inmobiliario;

public class EncuestaPostventa {
    private int idEncuestaPostventa;
    private int idEncuestaDetalle;

    private String item;
    private Boolean recepcion;
    private String observacion;

    public EncuestaPostventa(int idEncuestaPostventa,
        int idEncuestaDetalle,
        String item,
        Boolean recepcion,
        String observacion) {

        this.idEncuestaPostventa = idEncuestaPostventa;
        this.idEncuestaDetalle = idEncuestaDetalle;

        this.item = item;
        this.recepcion = recepcion;
        this.observacion = observacion;
    }

    public int traerIdEncuestaPostventa() {
        return idEncuestaPostventa;
    }
    public void asignarIdEncuestaPostventa(int idEncuestaPostventa) {
        this.idEncuestaPostventa = idEncuestaPostventa;
    }

    public int traerIdEncuestaDetalle() {
        return idEncuestaDetalle;
    }
    public void asignarIdEncuestaDetalle(int idEncuestaDetalle) {
        this.idEncuestaDetalle = idEncuestaDetalle;
    }

    public String traerItem() {
        return item;
    }
    public void asignarItem(String item) {
        this.item = item;
    }

    public Boolean traerRecepcion() {
        return recepcion;
    }
    public void asignarRecepcion(Boolean recepcion) {
        this.recepcion = recepcion;
    }

    public String traerObservacion() {
        return observacion;
    }
    public void asignarObservacion(String observacion) {
        this.observacion = observacion;
    }
}

package net.gestionwireless.officemovil.inmobiliario;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

适配器:

public class EncuestaPostventaAdapter extends ArrayAdapter<EncuestaPostventa> {
    private Context context;
    private ArrayList<EncuestaPostventa> datos;

    public EncuestaPostventaAdapter(Context context, ArrayList<EncuestaPostventa> datos) {
        super(context, R.layout.encuestapostventa_item, datos);

        this.context = context;
        this.datos = datos;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View item = LayoutInflater.from(context).inflate(
            R.layout.encuestapostventa_item, null);

        TextView tvItem = (TextView) item.findViewById(R.id.tvItem);
        tvItem.setText(datos.get(position).traerItem());

        CheckBox chkRecepcion = (CheckBox) item.findViewById(R.id.chkRecepcion);
        chkRecepcion.setChecked(datos.get(position).traerRecepcion());

        EditText editObservacion = (EditText) item.findViewById(R.id.editObservacion);
        editObservacion.setText(datos.get(position).traerObservacion());

        return item;
    }

}

每个项目的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tvItem"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".33"
        android:textSize="@dimen/texto_L" />

    <CheckBox
        android:id="@+id/chkRecepcion"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".1"/>

    <EditText
        android:id="@+id/editObservacion"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".57"
        android:textSize="@dimen/texto_L"
        android:inputType="textCapSentences" />

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

如果您在ArrayAdapter.getView()中添加日志声明,您将会在两秒钟内意识到发生了什么。

滚动列表时,您编辑的列表项将滚动到视图之外。当项目滚动回视图时,将重新创建视图并调用getView()。由于您的适配器没有表示之前所做的更改,因此getView()会使用原始未编辑数据重新创建视图。

如果在焦点丢失时发生这种情况,那必定意味着焦点丢失事件正在触发列表项上的视图更新。我从未在列表项中进行过编辑,所以我不熟悉这种行为。

您需要在EditText和CheckBox上放置事件侦听器,将其编辑状态存储在某处。然后,您的适配器需要在创建列表项时使用该编辑状态。

您可能必须编写一个更复杂的适配器,直接扩展BaseAdapter。适配器是列表视图的模型,除了适配器之外,ListView中没有状态。对于ListView,视图可以随时更新其列表的任何部分,因此适配器必须始终拥有ListView的当前模型数据。