Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


EditarTexto contenido dentro de ExpandableListView desaparecer al hacer clic en siguiente ExpandableListView encabezado

Tengo un edittext dentro de un artículo del item de lista expandablelistview . A continuación, introduje un texto dentro de este edittext , pero cada vez que haga clic en otro encabezado de lista expandablelistview , el texto que edittext desaparece.

Ya he utilizado android:windowSoftInputMode="adjustPan" dentro de mi Manifest.xml y muchas otras posibles soluciones, pero no funcionó.

Este es mi adaptador:

 public class ExpendableAdapter extends BaseExpandableListAdapter { private Context _context; private List<String> _listDataHeader; private HashMap<String, List<ExpandItemModel>> _listDataChild; public ExpendableAdapter(Context context, List<String> listDataHeader, HashMap<String, List<ExpandItemModel>> listChildData) { this._context = context; this._listDataHeader = listDataHeader; this._listDataChild = listChildData; } @Override public Object getChild(int groupPosition, int childPosititon) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .get(childPosititon); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, null); } final EditText etTotal = (EditText)convertView .findViewById(R.id.et_total); etTotal.setText(childText.getTotal); return convertView; } @Override public int getChildrenCount(int groupPosition) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .size(); } @Override public Object getGroup(int groupPosition) { return this._listDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this._listDataHeader.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_group, null); } TextView tvHeader = (TextView) convertView .findViewById(R.id.tv_header); tvHeader.setTypeface(null, Typeface.BOLD); tvHeader.setText(headerTitle); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

Y este es el diseño:

 <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rl_expen_but" android:layout_below="@+id/rl_ats_draft2" android:layout_above="@+id/selanjutnya" > <ExpandableListView android:background="@color/cardview_light_background" android:id="@+id/lvExp" android:descendantFocusability="beforeDescendants" android:layout_height="wrap_content" android:layout_width="match_parent" android:animateLayoutChanges="true"/> <View android:layout_below="@+id/lvExp" android:layout_width="match_parent" android:layout_height="1dp" android:background="#bebebe"/> </RelativeLayout> 

¿Hay algo mal que hice con los códigos anteriores? Gracias.

EDITAR:

Así es como se ve mi código después de editarlo como sugiere chandil03. La lista expandible ya no se actualiza cuando se expanden los encabezados. Pero extrañamente, cuando escribí los valores en edittext en el grupo 0 y la posición 0 del niño, entonces en algún otro edittext en el goupposition y el childposition diferentes aparecen los mismos valores exactos que mecanografié en edittext anterior. O incluso más extraño, los valores en edittext anterior a veces desaparecido.

 static class ViewHolder { protected View et; public void addView(View et){ this.et = et; } } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); ViewHolder viewHolder; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.addView(convertView .findViewById(R.id.et_total)); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } final EditText etTotal = (EditText)convertView .findViewById(R.id.et_total); etTotal.setText(childText.getTotal); return convertView; } 

  • Última fila de listview expandible no vista completa en android
  • Android - Cómo configurar el relleno para TextView en ListView o ExpandableListView
  • ExpandableListView con un EditText
  • Listview / ExpandableListVer imágenes de contenido cuando se llama notifyDataSetChanged
  • Android: getChild () EditText valores en el botón de clic en ExpandableListView
  • ExpandableListFragment con LoaderManager para el paquete de compatibilidad
  • El método findViewById (int) no está definido para el tipo
  • Vista de lista expandible setOnChildClickListener no funciona
  • 4 Solutions collect form web for “EditarTexto contenido dentro de ExpandableListView desaparecer al hacer clic en siguiente ExpandableListView encabezado”

    Cada vez que se expande otra lista de grupos se actualiza y se obtiene otra instancia de EditText allí que no tiene texto. El EditText en el que ingresaste texto se habría convertido en hijo de otro groupView .

    Por lo tanto, le recomendaría crear una clase ViewHolder y mantener su vista en ella y establecerla como una etiqueta y en getView() comprobar si convertView es nulo que ya ha hecho. Simplemente agregue otra parte y getTag de convertView y establezca valores en consecuencia.

    Por ejemplo:

     @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.my_layout, parent, false); ViewHolder holder = new ViewHolder(); // View holder to save views. holder.addView(v.findViewById(R.id.myView)); v.setTag(holder); } else{ ViewHolder holder = (ViewHolder) v.getTag(); // get tag and set values // Do whatever you need to with the group view } return v; } 

    EDITAR 1

    He modificado tu código. Echa un vistazo a los comentarios también.

     @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); ViewHolder holder; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(convertView); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.editText.setText(childText.getTotal); // Here whatever you will type in edittext will be overwritten by the value of 'childText.getTotal'. So after you are done writing in edit text make sore you change that in "_listDataChild" list. return convertView; } /**This is a class that holds view, Here im not talking about support.v7.widget.RecyclerView.ViewHolder class. Though concept is more or less same.*/ class ViewHolder{ EditText editText; public ViewHolder(View v) { editText = (EditText) v.findViewById(R.id.et_total); } } 

    EDIT 2

    Agregue el código siguiente en el método getChildView() .

     holder.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) childText.getTotal = holder.editText.getText().toString(); // In java variable contains reference of Object so when you change childText object, it will be reflected in same HashMap you are getting data from. } }); 

    El EditText se recicla cada vez que desplaza hacia abajo o hace clic en otro encabezado en el ExpandableListView.

    Su mejor opción será guardar el texto que el usuario introduce en su modelo, por ejemplo:

     etTotal.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { childText.setTotal(etTotal.getText().toString().trim()); } } }); 

    Primero cree una clase de modelo ficticio para almacenar sus datos desde edittext así:

     public class DummyModel { String edt_field; // //And any other data you might want to store // public DummyModel(String field) { this.edt_field=field; } } 

    A continuación, cree un arraylist estático para almacenar sus datos:

     public class DummyStatic { public static ArrayList<DummyModel> arl_static=new ArrayList(); } 

    A continuación, en su clase de adaptador, cambie su método getChildView () de la siguiente manera:

      @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, null); } final EditText etTotal = (EditText)convertView .findViewById(R.id.et_total); etTotal.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { DummyStatic.arl_static.add(childPosition,new DummyModel(charSequence.toString())); } @Override public void afterTextChanged(Editable editable) { } }); etTotal.setText(childText.getTotal); return convertView; } 

    Lo que este código va a hacer es que al escribir los caracteres en el edittext se almacenarán en el objeto DummyModel dentro del arraylist.

    Puede recuperar estos datos:

     String value = DummyStatic.arl_static.get(position).edt_field; 

    Finalmente pude manejar esto usando esta biblioteca:

    http://bignerdranch.github.io/expandable-recycler-view/

    A continuación, utilizando AddTextChangedListener, inserté el valor que escribo. Después de eso, compruebe los valores insertados en ViewHolderChild. Por ejemplo:

     public void bind(final MyModel model) { tvName.setText(model.getName()); tvPrice.setText(model.getPrice()); tvNote.setText(model.getNote()); for(int i=0;i<listProduct.size();i++){ if(listProduct.get(i).getIdProduct().equals(model.getIdProduct())){ et.setText(listProduct.get(i).getQuantity()); break; } } et.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) { } @Override public void afterTextChanged(Editable s) { if(m!=null){ listProduct.remove(m); } if (!s.toString().equals("")) { m = new MyModel(); m.setName(model.getName()); m.setNote(model.getNote()); m.setIdProduct(model.getIdProduct()); m.setPrice(model.getPrice()); m.setQuantity(s.toString()); m.setSubtotal(Long.parseLong(s.toString()) * Long.parseLong(model.getPrice()) + ""); m.setStock(model.getStock()); listProduct.add(m); } } }); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.