android listview android-edittext baseadapter convertview

Edittext en Listview android



android-edittext baseadapter (5)

Tengo Listview con editext y textview.

Cuando toco el texto de edición, el texto de edición pierde el enfoque!

android:windowSoftInputMode="adjustPan"(AndroidManifest.xml) este problema configurando android:windowSoftInputMode="adjustPan"(AndroidManifest.xml) . Ahora toco el texto de edición para que editext se enfoque, pero la etiqueta de la aplicación y algo de vista de lista desaparecen (parte superior).

Quiero enfocarme cuando el usuario toque el texto de edición sin pérdida de la etiqueta de la aplicación y un poco de vista de lista.

Código que he implementado:

Debajo de la codificación, enfóquese cuando el usuario toque el texto de edición, pero la etiqueta de la aplicación y algo de la vista de lista desaparecen cuando se abre el teclado. Quiero enfocar cuando el usuario toca el texto de edición sin pérdida de la etiqueta de la aplicación y algo de la vista de la lista.

1) AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MyListViewDemoActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustPan" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

2) raw_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:id="@+id/mEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

3) main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/mListView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

4) MyListViewDemoActivity

public class MyListViewDemoActivity extends Activity { private ListView mListView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView=(ListView)findViewById(R.id.mListView); mListView.setAdapter(new MyAdapter(this)); } } class MyAdapter extends BaseAdapter { private Activity mContext; private String character[]={"a","b","c","d","e","f","g","h","i","j"}; public MyAdapter(Activity context) { mContext=context; } @Override public int getCount() { // TODO Auto-generated method stub return character.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } private class Holder { EditText mEditText; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final Holder holder; if (convertView == null) { holder = new Holder(); LayoutInflater inflater =mContext.getLayoutInflater(); convertView = inflater.inflate(R.layout.raw_layout, null); holder.mEditText = (EditText) convertView .findViewById(R.id.mEditText); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } holder.mEditText.setText(character[position]); holder.mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // TODO Auto-generated method stub if (!hasFocus){ final EditText etxt = (EditText) v; holder.mEditText.setText(etxt.getText().toString()); } } }); return convertView; } }


Estaba teniendo el mismo problema. Mi teclado numérico aparecería momentáneamente antes de ser reemplazado por el teclado qwerty y el foco de pérdida de EditText.

El problema es que el teclado que aparece hace que su EditText pierda el enfoque. Para evitar esto, coloque lo siguiente en su AndroidManifest.xml para la Actividad (o Actividades) apropiada:

android:windowSoftInputMode="adjustPan"

Ver la documentation Android:

Cuando el método de entrada aparece en la pantalla, reduce la cantidad de espacio disponible para la interfaz de usuario de la aplicación. El sistema toma una decisión sobre cómo debe ajustar la parte visible de su interfaz de usuario, pero puede que no funcione correctamente. Para garantizar el mejor comportamiento para su aplicación, debe especificar cómo desea que el sistema muestre su interfaz de usuario en el espacio restante.

Para declarar su tratamiento preferido en una actividad, use el atributo android:windowSoftInputMode en el elemento <activity> su manifiesto con uno de los valores de "ajuste".

Por ejemplo, para asegurarse de que el sistema cambia el tamaño de su diseño al espacio disponible, lo que garantiza que todo el contenido de su diseño sea accesible (aunque probablemente requiera desplazamiento), "adjustResize"


Resolví este problema de "Poner EditText en ListView como un elemento" recientemente. No soy muy bueno en inglés. Así que si hay algo que no explique claramente por favor dímelo.

Sabemos que ListView se puede desplazar verticalmente y queremos colocar EditText en ListView como un elemento.

Primero: Añadir

android: windowSoftInputMode = "adjustResize"

en su AndroidManifest.xml en el nodo de actividad.

Segundo: creamos un pojo como fuente de datos modelo para controlar el estado de edición del texto

Line.java

public class Line{ int num; String text; boolean focus; get set method and so on... }

Tercero: escribimos un adaptador para adaptar EditText a ListView.

Item item_line.xml:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="80dp"> <EditText android:id="@+id/etLine" android:focusable="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"/> </FrameLayout>

Adaptador:

@Override public View getView(final int position, View convertView, final ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_line, parent, false); holder.etLine = (EditText) convertView.findViewById(R.id.etLine); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Line line = lines.get(position); // step 1: remove android.text.TextWatcher added in step 5 to make sure android.text.TextWatcher // don''t trigger in step 2; // why? // // note: When an object of a type is attached to an Editable, // TextWatcher''s methods will be called when the EidtText''s text is changed. // // EditText use a ArrayList<TextWatcher> type object to store the listener, so we must // make sure there''s only one TextWatcher object in this list; // // Avoid triggering TextWatcher''s method in step 2 we remove it at first time. // if (holder.etLine.getTag() instanceof TextWatcher) { holder.etLine.removeTextChangedListener((TextWatcher) (holder.etLine.getTag())); } // step 2: set text and focus after remove android.text.TextWatcher(step 1); holder.etLine.setHint(position + "."); // set text if (TextUtils.isEmpty(line.getText())) { holder.etLine.setTextKeepState(""); } else { holder.etLine.setTextKeepState(line.getText()); } // set focus status // why? // // note: ListView has a very elegant recycle algorithm. So views in ListView is not reliable. // Especially in this case, EditText is an item of ListView. Software input window may cause // ListView relayout leading adapter''s getView() invoke many times. // Above all if we change EditText''s focus state directly in EditText level(not in Adapter). // The focus state may be messed up when the particularly view reused in other position. // // So using data source control View''s state is the core to deal with this problem. if (line.isFocus()) { holder.etLine.requestFocus(); } else { holder.etLine.clearFocus(); } // step 3: set an OnTouchListener to EditText to update focus status indicator in data source // why? // // in step 2, we know we must control view state through data source. We use OnTouchListener // to watch the state change and update the data source when user move up fingers(ACTION_UP). // We don''t want to consume the touch event, simply return false in method onTouch(). holder.etLine.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { check(position); } return false; } }); // step 4: set TextWatcher to EditText to listen text changes in EditText to updating the text in data source // why? // // again, use data source to control view state. // When user edit the text in one EditText item and scroll the ListView. The particularly EditText item will be // reuse in adapter''s getView(), this may lead text messed up in ListView. // How to deal with this problem? // Easy! We update the text in data source at the same time when user is editing. TextWatcher is the best way to // do this. final TextWatcher watcher = new SimpeTextWather() { @Override public void afterTextChanged(Editable s) { if (TextUtils.isEmpty(s)) { line.setText(null); } else { line.setText(String.valueOf(s)); } } }; holder.etLine.addTextChangedListener(watcher); // step 5: Set watcher as a tag of EditText. // so we can remove the same object which was setted to EditText in step 4; // Make sure only one callback is attached to EditText holder.etLine.setTag(watcher); return convertView; } /** * change focus status in data source */ private void check(int position) { for (Line l : lines) { l.setFocus(false); } lines.get(position).setFocus(true); } static class ViewHolder { EditText etLine; }

¡Todo listo!

Puedes leer más detalles en mi github.

Demostración: https://github.com/Aspsine/EditTextInListView


Sin ver su código, ¿cómo podemos sugerirle la posible solución a su problema? Así que mantén la práctica de publicar un posible código cuando hagas cualquier pregunta.

Sin embargo, aquí he encontrado un tutorial para implementar Android Focusable EditText dentro de ListView . Repase el ejemplo e intente implementar a su manera o encuentre la solución a su problema.


ListView recrea la Vista, intenta usar un LinearLayout dentro de ScrollView, luego en tu código usa un runOnUiThread para llenar tu vista en otro hilo como este

public void fillDataTask(Context context, final LinearLayout listView) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { fillView(context, listView); } }); } private void fillView(Context context, LinearLayout listView) { MyAdapter adapter = new MyAdapter(context); final int adapterCount = adapter.getCount(); for (int i = 0; i < adapterCount; i++) { View item = adapter.getView(i, null, null); listView.addView(item); } }


<ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false" android:id="@+id/list1" android:layout_weight="1" android:cacheColorHint="#00000000" android:focusable="false" > </ListView>