2012-10-04 39 views
23

Tengo un EditText dentro de cada fila de ListView. Por alguna razón, cuando toco EditText, gana foco brevemente pero luego lo pierde de inmediato.EditText dentro de ListView no se mantendrá enfocado

me han tratado estas cosas:

listView.setItemsCanFocus(true); 
editText.setFocusable(true); 


Mientras que el EditText es (brevemente) se centró, la clave Enter dice Next y la auto-correct bar está presente. Cuando pierde el foco, el teclado suave permanece hacia arriba, pero la tecla Enter se convierte en Return Arrow, y el auto-correct bar desaparece.

+0

supongo que se olvidó de cómo se reciclan las vistas. sugerencia: no use editText en el elemento de la lista. – njzk2

+1

¿Por qué el reciclaje de ellos sería importante? – Matt

+2

porque hay muy pocos edittext que se utilizan alternativamente para dibujar cada fila, y están recibiendo todo tipo de cambio de estado de enfoque al mismo tiempo – njzk2

Respuesta

8

EditText s dentro de ListView s son extremadamente difíciles. Te sugiero que los evites como la peste si es posible. Cuando estaba jugando con ellos, this answer fue útil sin embargo. Si solo tiene algunos artículos, siempre puede usar un ScrollView.

+0

Sí, usar una distribución lineal vertical dentro de una vista de desplazamiento hizo el truco. Una cosa que noté es que si se trata de una actividad de lista, los EditTexts en ListView funcionan bien. Pero no si se trata de un ListView en una actividad regular. – Matt

+1

Si los evitamos, ¿cuál es el reemplazo? –

+0

"Siempre se puede utilizar un ScrollView" – dmon

0

Sé que esta pregunta es antigua, pero también estaba luchando con EditText y ListView hoy. Creo que perder tiempo con el problema de foco o actualizar el conjunto de datos es el final de la línea.

Así que creé una Actividad y agregué dinámicamente los controles que necesitaba. En este ejemplo, agregué dos controles: una vista de texto y un texto de edición.

Primero creo una clase para ser un "contenedor" de los controles y los pongo en un ScrollView.

El archivo layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/llMain" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvHeader" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <ScrollView 
     android:id="@+id/svMain" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:id="@+id/llForm" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" > 

     </LinearLayout> 
    </ScrollView> 

</LinearLayout> 

La clase "containter":

import android.widget.EditText; 

public class RespostasArray { 

    private int pergunta; 
    private int formulario; 
    private int form_coord; 
    private int coordenada; 
    private int form_resposta; 
    private String questao; 
    private String resposta; 
    private EditText respostaEdit; 

    public RespostasArray() { 
     respostaEdit = null; 
    } 

    public int getPergunta() { 
     return pergunta; 
    } 

    public void setPergunta(int pergunta) { 
     this.pergunta = pergunta; 
    } 

    public int getFormulario() { 
     return formulario; 
    } 

    public void setFormulario(int formulario) { 
     this.formulario = formulario; 
    } 

    public int getForm_coord() { 
     return form_coord; 
    } 

    public void setForm_coord(int form_coord) { 
     this.form_coord = form_coord; 
    } 

    public int getCoordenada() { 
     return coordenada; 
    } 

    public void setCoordenada(int coordenada) { 
     this.coordenada = coordenada; 
    } 

    public int getForm_resposta() { 
     return form_resposta; 
    } 

    public void setForm_resposta(int form_resposta) { 
     this.form_resposta = form_resposta; 
    } 

    public String getQuestao() { 
     return questao; 
    } 

    public void setQuestao(String questao) { 
     this.questao = questao; 
    } 

    public String getResposta() { 
     return resposta; 
    } 

    public void setResposta(String resposta) { 
     this.resposta = resposta; 
    } 

    public EditText getRespostaEdit() { 
     return respostaEdit; 
    } 

    public void setRespostaEdit(EditText respostaEdit) { 
     this.respostaEdit = respostaEdit; 
    } 

} 

Por lo tanto, la actividad principal:

import java.util.ArrayList; 
    import java.util.List; 

    import jv.android.getpoint.R; 
    import jv.android.getpointlib.data.Formularios; 
    import jv.android.getpointlib.data.GetPointDataHelper; 
    import jv.android.getpointlib.data.Respostas; 
    import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.view.KeyEvent; 
    import android.view.WindowManager.LayoutParams; 
    import android.widget.EditText; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 

    public class RespostasActivity extends Activity { 

     private Intent intent; 
     private ArrayList<RespostasArray> listItems = null; 
     private GetPointDataHelper db = null; 
     private int coordenada = -1; 
     private int formulario = -1; 
     private LinearLayout llRespostas; 
     private TextView tvRespostasHeader; 

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

      llRespostas = (LinearLayout)findViewById(R.id.llRespostas); 
      tvHeader = (TextView)findViewById(R.id.tvHeader); 

      listItems = new ArrayList<RespostasArray>(); 
      db = new GetPointDataHelper(this, false); 

      intent = getIntent(); 

      if (intent != null) 
      { 
       Bundle params = intent.getExtras(); 

       if (params != null) { 
        coordenada = params.getInt("coordenada"); 
        formulario = params.getInt("formulario"); 

        tvHeader.setText("Some header"); 

// Load the fields I need from SQLite. Change it to your needs. 
        List<Respostas> respostas = db.selectAllRespostaDaCoordenada (coordenada, formulario); 

        if (respostas != null && respostas.size() > 0) { 
         for (int i = 0; i < respostas.size(); i++) { 
          TextView tv = new TextView(getApplicationContext()); 
          tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
          tv.setText(respostas.get(i).getQuestao().trim() + (respostas.get(i).getQuestao().trim().endsWith(":") ? "" : ":")); 
          llRespostas.addView(tv); 

          EditText et = new EditText(getApplicationContext()); 
          et.setText(respostas.get(i).getResposta().trim()); 
          et.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));      
          llRespostas.addView(et); 

          RespostasArray ra = new RespostasArray(); 
          ra.setCoordenada(respostas.get(i).getCoordenada()); 
          ra.setForm_coord(respostas.get(i).getForm_coord()); 
          ra.setForm_resposta(respostas.get(i).getForm_resposta()); 
          ra.setFormulario(respostas.get(i).getFormulario()); 
          ra.setPergunta(respostas.get(i).getPergunta()); 
          ra.setQuestao(respostas.get(i).getQuestao()); 
          ra.setResposta(respostas.get(i).getResposta()); 
          ra.setRespostaEdit(et);      

          listItems.add(ra);      
         } 
        } 
       } 
      }    
     } 

     @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) {  
      if (keyCode == KeyEvent.KEYCODE_BACK) { 
       doProcessResult();   
      }  

      return super.onKeyDown(keyCode, event); 
     } 

     private void doProcessResult() { 
      for (int i = 0; i < listItems.size(); i++) { 
       if (listItems.get(i).getForm_resposta() == 0) { 
        db.insertResposta(listItems.get(i).getFormulario(), listItems.get(i).getForm_coord(), listItems.get(i).getPergunta(), listItems.get(i).getRespostaEdit().getText().toString()); 
       } else { 
        db.updateResposta(listItems.get(i).getForm_resposta(), listItems.get(i).getRespostaEdit().getText().toString());     
       } 
      } 
     } 
    } 

espero que ayude a alguien.

42

Si desea que los elementos de la lista para tomar el foco, es bastante sencillo: Hacer la vista de lista no enfocable, y dicen que su enfoque es que permite afterDescendantsEditText s y otros artículos enfocable tomar enfoque.

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:descendantFocusability="afterDescendants" 
    android:focusable="false" /> 
+2

no parece estar funcionando –

+1

Me funcionó ... gracias :) –

+0

Gracias por su valiosa respuesta :) – Subho

Cuestiones relacionadas