Android 在ExpandableListView中调用notifyDataSetChanged()时失去焦点
我有一个Android 在ExpandableListView中调用notifyDataSetChanged()时失去焦点,android,expandablelistview,Android,Expandablelistview,我有一个ExpandableListView,其中包含2个TextViews和一个EditText,用于输入每个孩子的金额,并允许内联编辑 当组的一个子组的金额发生更改时,我需要立即更改组的金额值 我已经这样做了,但问题是,当我调用notifyDataSetChanged()方法来显示组中的更改时,我失去了当前edittext的焦点。也就是说,如果我更改了组的第一个子项中的“金额”字段,然后单击第二个子项的“金额”字段,则由于notifyDataSetChanged(),焦点仍在第一个子项上 我
ExpandableListView
,其中包含2个TextView
s和一个EditText
,用于输入每个孩子的金额,并允许内联编辑
当组的一个子组的金额发生更改时,我需要立即更改组的金额值
我已经这样做了,但问题是,当我调用notifyDataSetChanged()
方法来显示组中的更改时,我失去了当前edittext
的焦点。也就是说,如果我更改了组的第一个子项中的“金额”字段,然后单击第二个子项的“金额”字段,则由于notifyDataSetChanged()
,焦点仍在第一个子项上
我怎样才能解决这个问题
我的代码如下
ExpandableListAdapter.java:
package com.example.empandroid.view;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import com.fort.empandroid.R;
import com.example.empandroid.model.Employee;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Typeface;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseExpandableListAdapter;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private final Context context;
private List<Employee> listDataHeader;
private HashMap<Integer, List<Employee>> listDataChild;
DecimalFormat df = new DecimalFormat("#.00");
int s;
Float value = 0.0f, change = 0.0f;
public ExpandableListAdapter(Context context, List<Employee> listDataHeader, HashMap<Integer, List<Employee>> listChildData) {
this.context = context;
this.listDataHeader = listDataHeader;
this.listDataChild = listChildData;
//this.context=mainContxt.getApplicationContext();
}
public static class ListHolder {
Employee expCoa;
TextView txtName;
TextView txtAmount;
TextView txtMonthTotal;
EditText edtAmount;
}
@Override
public int getGroupCount() {
return this.listDataHeader.size();
}
@Override
public int getChildrenCount(int groupPosition) {
int childcount = this.listDataChild.get(this.listDataHeader.get(groupPosition).getiD()).size();
return childcount;
}
@Override
public Employee getGroup(int groupPosition) {
return this.listDataHeader.get(groupPosition);
}
@Override
public Employee getChild(int groupPosition, int childPosition) {
return this.listDataChild.get(this.listDataHeader.get(groupPosition).getiD()).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
df.setMinimumIntegerDigits(1);
ListHolder expHolder = new ListHolder();
expHolder.expCoa = getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.list_group, null);
}
expHolder.txtName = (TextView) convertView.findViewById(R.id.txtAccount);
expHolder.txtAmount = (TextView) convertView.findViewById(R.id.txtAmount);
expHolder.txtMonthTotal = (TextView) convertView.findViewById(R.id.txtMonthTotal);
convertView.setTag(expHolder);
expHolder.txtName.setTypeface(null, Typeface.BOLD);
expHolder.txtAmount.setTypeface(null, Typeface.BOLD);
expHolder.txtMonthTotal.setTypeface(null, Typeface.BOLD);
setupItem(expHolder);
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
df.setMinimumIntegerDigits(1);
final ListHolder expHolder = new ListHolder();
expHolder.expCoa = getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.list_item, null);
}
expHolder.txtName = (TextView) convertView.findViewById(R.id.txtAccount);
expHolder.edtAmount = (EditText) convertView.findViewById(R.id.edtAmount);
expHolder.txtMonthTotal = (TextView) convertView.findViewById(R.id.txtMonthTotal);
convertView.setTag(expHolder);
setupChildItem(expHolder);
//expHolder.edtAmount.requestFocus();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
final AlertDialog dialog = builder.create();
//AlertDialog.Builder alert = new AlertDialog.Builder(mainContxt);
expHolder.edtAmount.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
onChange(v, groupPosition, childPosition, expHolder.expCoa);
} else {
//Toast.makeText(context, " else "+s, 68000).show();
onFocus(v);
}
}
});
return convertView;
}
private void onFocus(View v) {
final EditText Caption = (EditText) v;
value = Float.parseFloat(Caption.getText().toString());
Toast.makeText(context, "onFocus value " + value + " change " + change, 68000).show();
}
public void onChange(View views, int groupPosition, int childPosition, Employee expCoaChd) {
final int position = views.getId();
final EditText Caption = (EditText) views;
change = Float.parseFloat(Caption.getText().toString());
if (value != change) { //use database type for this loop condition
//perform change
ListHolder expHolders = new ListHolder();
expHolders.expCoa = getGroup(groupPosition);
expHolders.expCoa.setAmount(expHolders.expCoa.getAmount() - expCoaChd.getAmount() + change);
expCoaChd.setAmount(change);
notifyDataSetChanged();
//Toast.makeText(context, "onChange value "+value+" change "+change, 68000).show();
change = 0.0f;
value = 0.0f;
}
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private void setupChildItem(ListHolder expHolder) {
expHolder.txtName.setText(expHolder.expCoa.getStrName());
if (expHolder.expCoa.getiD() == -998 || expHolder.expCoa.getiD() == -999) {
expHolder.edtAmount.setText("");
expHolder.txtMonthTotal.setText("");
} else {
expHolder.edtAmount.setText(df.format(expHolder.expCoa.getAmount()));
expHolder.txtMonthTotal.setText(df.format(expHolder.expCoa.getExpenseMTD()));
}
}
private void setupItem(ListHolder expHolder) {
expHolder.txtName.setText(expHolder.expCoa.getStrName());
if (expHolder.expCoa.getiD() == -998 || expHolder.expCoa.getiD() == -999) {
expHolder.txtAmount.setText("");
expHolder.txtMonthTotal.setText("");
} else {
expHolder.txtAmount.setText(df.format(expHolder.expCoa.getAmount()));
expHolder.txtMonthTotal.setText(df.format(expHolder.expCoa.getExpenseMTD()));
}
}
}
package com.example.empanroid.view;
导入java.text.DecimalFormat;
导入java.util.HashMap;
导入java.util.List;
导入com.fort.empanroid.R;
导入com.example.empanroid.model.Employee;
导入android.app.AlertDialog;
导入android.app.Dialog;
导入android.content.Context;
导入android.graphics.Typeface;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnFocusChangeListener;
导入android.view.ViewGroup;
导入android.view.WindowManager;
导入android.widget.BaseExpandableListAdapter;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.Toast;
公共类ExpandableListAdapter扩展了BaseExpandableListAdapter{
私人最终语境;
私有列表listDataHeader;
私有HashMap listDataChild;
DecimalFormat df=新的DecimalFormat(#.00”);
int-s;
浮动值=0.0f,变化=0.0f;
公共ExpandableListAdapter(上下文上下文、列表listDataHeader、HashMap listChildData){
this.context=上下文;
this.listDataHeader=listDataHeader;
this.listDataChild=listChildData;
//this.context=mainContxt.getApplicationContext();
}
公共静态类列表持有者{
雇员出口证;
TextView-txtName;
TextView txtAmount;
TextView-txtMonthTotal;
编辑文本数量;
}
@凌驾
public int getGroupCount(){
返回此.listDataHeader.size();
}
@凌驾
公共整数getChildrenCount(整数组位置){
int childcount=this.listDataChild.get(this.listDataHeader.get(groupPosition.getiD()).size();
返回childcount;
}
@凌驾
公共雇员getGroup(int groupPosition){
返回此.listDataHeader.get(groupPosition);
}
@凌驾
公共雇员getChild(int-groupPosition,int-childPosition){
返回this.listDataChild.get(this.listDataHeader.get(groupPosition.getiD()).get(childPosition);
}
@凌驾
公共长getGroupId(int-groupPosition){
返回组位置;
}
@凌驾
公共长getChildId(int-groupPosition,int-childPosition){
返回子位置;
}
@凌驾
公共布尔表ID(){
返回false;
}
@凌驾
公共视图getGroupView(int groupPosition、布尔isExpanded、视图convertView、视图组父级){
df.设置最小整数位数(1);
ListHolder expHolder=新ListHolder();
expHolder.expCoa=getGroup(groupPosition);
if(convertView==null){
LayoutInflater INFLATER=(LayoutInflater)this.context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
convertView=infalInflater.充气(R.layout.list_组,空);
}
expHolder.txtName=(TextView)convertView.findViewById(R.id.txtAccount);
expHolder.txtAmount=(TextView)convertView.findViewById(R.id.txtAmount);
expHolder.txtMonthTotal=(TextView)convertView.findViewById(R.id.txtMonthTotal);
convertView.setTag(expHolder);
expHolder.txtName.setTypeface(null,Typeface.BOLD);
expHolder.txtAmount.setTypeface(null,Typeface.BOLD);
expHolder.txtMonthTotal.setTypeface(null,Typeface.BOLD);
项目(持有人);
返回视图;
}
@凌驾
公共视图getChildView(最终int groupPosition,最终int childPosition,
布尔值isLastChild、视图转换视图、视图组父级){
df.设置最小整数位数(1);
最终ListHolder expHolder=新ListHolder();
expHolder.expCoa=getChild(groupPosition,childPosition);
if(convertView==null){
LayoutInflater INFLATER=(LayoutInflater)this.context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
convertView=infalInflater.充气(R.layout.list_项,空);
}
expHolder.txtName=(TextView)convertView.findViewById(R.id.txtAccount);
expHolder.edtAmount=(EditText)convertView.findViewById(R.id.edtAmount);
expHolder.txtMonthTotal=(TextView)convertView.findViewById(R.id.txtMonthTotal);
convertView.setTag(expHolder);
项目(出口持有人);
//expHolder.edtmount.requestFocus();
AlertDialog.Builder=新建AlertDialog.Builder(上下文);
最终AlertDialog=builder.create();
//AlertDialog.Builder alert=新建AlertDialog.Builder(mainContxt);
expHolder.edtmount.setOnFocusChangeListener(新的OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
如果(!hasFocus){
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入\u状态\u始终可见);
onChange(v,groupPosition,childPosition,expHolder.expCoa);
}否则{
//makeText(上下文,“else”+s,68000).show();
聚焦(五);
}
}
<?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:orientation="horizontal"
>
<TextView
android:id="@+id/txtAccount"
android:layout_width="0dp"
android:layout_height="50dp"
android:textSize="16sp"
android:gravity="center_vertical"
android:layout_weight="3"/>
<TextView
android:id="@+id/txtAmount"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="end"
android:textSize="15sp"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<TextView
android:id="@+id/txtMonthTotal"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="end"
android:textSize="15sp"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
<?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:orientation="horizontal"
>
<TextView
android:id="@+id/txtAccount"
android:layout_width="0dp"
android:layout_height="50dp"
android:textSize="15sp"
android:gravity="center_vertical"
android:layout_weight="3"/>
<EditText
android:id="@+id/edtAmount"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="end"
android:textSize="15sp"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<TextView
android:id="@+id/txtMonthTotal"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="end"
android:textSize="15sp"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>