zamroni hamim zamroni hamim - 4 months ago 101
Android Question

EditText content inside ExpandableListView dissapear when clicking next ExpandableListView header

I have an

edittext
inside an
expandablelistview
item child. Then, I entered a text inside this
edittext
, but whenever I click other
expandablelistview
header, the text I entered disappear.

I already used
android:windowSoftInputMode="adjustPan"
inside my Manifest.xml and many other possible fixes, but didn't work.

this is my adapter:

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;
}
}


And this is the layout:

<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>


Is there something wrong I did with above codes? Thank you.

EDIT:

This is how my code looks like after I edited it as suggested by chandil03. The expandablelistview no longer refreshes when I expand headers. But strangely, when I typed values in edittext at groupposition 0 and child position 0, then in some other edittext in different goupposition and childposition appear the same exact values I typed at previous edittext. Or even stranger, the values at previous edittext sometimes dissapeared.

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;
}

Answer

I finally able to handle this by using this library:

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

Then by using AddTextChangedListener, I inserted the value I type. After that, check the inserted values at ViewHolderChild. For example:

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);
                    }
                }
            });
        }