2015-02-23 52 views
0

在我正在開發的Android應用程序中,我正在加載一些用於輸入一些數據的項目列表;每個項目都有一個複選框和一個EditText,用戶可以選中該複選框並輸入關於該項目的一些註釋。該列表是從本地數據庫動態加載的,而本地數據庫又是在前一點從遠程數據庫填充的。現在,我遇到的問題是,每當我關注EditText時,在失去對元素的注意力之後,列表似乎再次加載(其中原本未被選中的元素/原本已被檢查過的元素,以及已經在其中輸入了文本的元素再次變得不被選中/空白,並且被檢查/有文本的那些最初回到原始狀態)。這隻發生在我失去對EditText的關注時;我可以檢查並取消選中複選框,並保留它們的離開方式(直到我失去對EditText的注意力)。我該如何避免這種情況,以便我的元素保留數據?在動態列表中的元素中輸入數據

我測試過的應用程序使用Android版本3.2和4.2

任何幫助,將不勝感激deviced。

這裏的加載列表中的活動:

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> 

回答

0

如果你把日誌語句在你ArrayAdapter.getView(),你就會明白這是怎麼回事在兩秒鐘。

當列表滾動時,您編輯的列表項滾動出視圖。當該項目被滾動回查看時,該視圖被重新創建並調用getView()。由於您的適配器沒有以前所做的更改的表示,因此getView()會使用原始未編輯的數據重新創建視圖。

如果在焦點丟失時發生了這種情況,那必定意味着焦點丟失事件正在觸發列表項上的視圖更新。我從來沒有在列表項中完成編輯,所以我不熟悉這種行爲。

您需要在您的EditText和CheckBox上放置事件偵聽器,以將其編輯狀態存儲在某處。然後,您的適配器在創建列表項時需要使用該編輯狀態。

您可能需要編寫一個更復雜的適配器,它可以直接擴展BaseAdapter。該適配器是您的列表視圖的型號,而除了您的適配器之外,在ListView中沒有任何狀態。對於ListView,視圖可以隨時更新其列表的任何部分,因此適配器必須始終具有ListView的當前模型數據。