我在expandablelistview中的每个最后一个子节点中使用edittext。仅当选中其复选框时,Edittexts才可见。这工作正常,但问题是当我选择一个新的lastchild时,之前的edittext,s值被复制到此。此外,当我滚动时,每个孩子的edittext值互换,给我带来很多麻烦。如何解决这个问题?我尝试了很多方法。不幸的是他们都没有工作。我在这里发布了getchildView的代码。在处理edittexts的可见性时,我也没有任何问题。
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final int groupPos=groupPosition;
final int childPos=childPosition;
final boolean islstchild=isLastChild;
final Industries_Level_3 child = (Industries_Level_3) getChild(groupPosition, childPosition);
if (convertView == null) {
convertView = inflater.inflate(R.layout.multilevel_list_item_child, null);
}
final EditText edtOther=(EditText)convertView.findViewById(R.id.editIndOther);
final CheckBox chkSelect=(CheckBox)convertView.findViewById(R.id.checkBoxInd);
chkSelect.setText(child.getIndname());
if(child.getSelected()!=null)
{
chkSelect.setChecked(child.getSelected());
if (isLastChild) {
if (child.getSelected()==true) {
edtOther.setVisibility(View.VISIBLE);
} else {
edtOther.setVisibility(View.GONE);
}
}else
{
edtOther.setVisibility(View.GONE);
}
}
/*Setting text to edittext*/
if(child.getOtherText()!=null)
{
if(child.getOtherText().length()>0)
{
edtOther.setText(child.getOtherText().toString());
}
}
chkSelect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(chkSelect.isChecked())
{
if(islstchild)
{
edtOther.setText("");
edtOther.setVisibility(View.VISIBLE);
edtOther.requestFocus();
}
grouplist.get(groupPos).getIndustry_Based_On_Group().get(childPos).setSelected(true);
notifyDataSetChanged();
if(!islstchild)
{
int count=0;
for (int i = 0; i < grouplist.get(groupPos).getIndustry_Based_On_Group()
.size(); i++) {
if (grouplist.get(groupPos).getIndustry_Based_On_Group().get(i).getSelected()==true) {
if(i!=grouplist.get(groupPos).getIndustry_Based_On_Group().size()-1)
{
count = count + 1;
}
if (count == grouplist.get(groupPos).getIndustry_Based_On_Group().size()-1) {
grouplist.get(groupPos).setSelected(true);
notifyDataSetChanged();
}
}
}
}
}else
{
if(!islstchild)
{
grouplist.get(groupPos).setSelected(false);
notifyDataSetChanged();
}else
{
edtOther.setText("");
child.setOtherText("");
edtOther.setVisibility(View.GONE);
}
grouplist.get(groupPos).getIndustry_Based_On_Group().get(childPos).setSelected(false);
notifyDataSetChanged();
}
}
});
edtOther.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
String text= edtOther.getText().toString();
child.setOtherText(text);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
return convertView;
}
更新:完整代码
public class IndBussinessAdapter extends BaseExpandableListAdapter{
LayoutInflater inflater;
/* list of group */
private List<IndustryGroup_Level_2> grouplist;
public IndBussinessAdapter(Context context,
List<IndustryGroup_Level_2> bsgrouplist) {
super();
this.grouplist = bsgrouplist;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition) {
List<Industries_Level_3> ch = grouplist.get(groupPosition)
.getIndustry_Based_On_Group();
return ch.size();
}
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final int groupPos=groupPosition;
final int childPos=childPosition;
final boolean islstchild=isLastChild;
final Industries_Level_3 child = (Industries_Level_3) getChild(groupPosition, childPosition);
if (convertView == null) {
convertView = inflater.inflate(R.layout.multilevel_list_item_child, null);
}
final EditText edtOther=(EditText)convertView.findViewById(R.id.editIndOther);
/*Setting text to edittext*/
if(child.getOtherText()!=null)
{
if(child.getOtherText().length()>0)
{
edtOther.setText(child.getOtherText().toString());
}
}
final CheckBox chkSelect=(CheckBox)convertView.findViewById(R.id.checkBoxInd);
chkSelect.setText(child.getIndname());
if(child.getSelected()!=null)
{
chkSelect.setChecked(child.getSelected());
if (isLastChild) {
if (child.getIndname().startsWith("Other") && child.getSelected()==true) {
edtOther.setVisibility(View.VISIBLE);
edtOther.requestFocus();
} else {
edtOther.setVisibility(View.GONE);
}
}else
{
edtOther.setVisibility(View.GONE);
}
}
chkSelect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(chkSelect.isChecked())
{
if(islstchild)
{
edtOther.setVisibility(View.VISIBLE);
edtOther.requestFocus();
}
grouplist.get(groupPos).getIndustry_Based_On_Group().get(childPos).setSelected(true);
notifyDataSetChanged();
if(!islstchild)
{
int count=0;
for (int i = 0; i < grouplist.get(groupPos).getIndustry_Based_On_Group()
.size(); i++) {
if (grouplist.get(groupPos).getIndustry_Based_On_Group().get(i).getSelected()==true) {
if(i!=grouplist.get(groupPos).getIndustry_Based_On_Group().size()-1)
{
count = count + 1;
}
if (count == grouplist.get(groupPos).getIndustry_Based_On_Group().size()-1) {
grouplist.get(groupPos).setSelected(true);
notifyDataSetChanged();
}
}
}
}
}else
{
if(!islstchild)
{
grouplist.get(groupPos).setSelected(false);
notifyDataSetChanged();
}else
{
edtOther.setText("");
child.setOtherText("");
edtOther.setVisibility(View.GONE);
}
grouplist.get(groupPos).getIndustry_Based_On_Group().get(childPos).setSelected(false);
notifyDataSetChanged();
}
}
});
edtOther.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
String text= edtOther.getText().toString();
child.setOtherText(text);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
return convertView;
}
public IndustryGroup_Level_2 getGroup(int groupPosition) {
return grouplist.get(groupPosition);
}
public int getGroupCount() {
return grouplist.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
final int gpos=groupPosition;
final IndustryGroup_Level_2 group = (IndustryGroup_Level_2) getGroup(groupPosition);
if (convertView == null) {
if (groupPosition==(grouplist.size())-1) {
convertView = inflater.inflate(R.layout.multilevel_list_item2,
null);
} else {
convertView = inflater.inflate(R.layout.multilevel_list_item,
null);
}
}
if (groupPosition==(grouplist.size())-1) {
convertView = inflater.inflate(R.layout.multilevel_list_item2,
null);
} else {
convertView = inflater.inflate(R.layout.multilevel_list_item,
null);
}
TextView groupName = (TextView) convertView.findViewById(R.id.textListItem);
groupName.setText(group.getIndgroupname());
final CheckBox chkSelect=(CheckBox)convertView.findViewById(R.id.checkBoxInd);
final EditText edtOther=(EditText)convertView.findViewById(R.id.editTextOtherGroup);
if (gpos==grouplist.size()-1) {
if (group.getSelected()) {
edtOther.setVisibility(View.VISIBLE);
edtOther.requestFocus();
} else {
edtOther.setText("");
edtOther.setVisibility(View.GONE);
}
}else
{
edtOther.setText("");
edtOther.setVisibility(View.GONE);
}
if(group.getSelected()!=null)
{
chkSelect.setChecked(group.getSelected());
}
chkSelect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("Arraylist size "+grouplist.size());
System.out.println("Group position "+gpos);
if(chkSelect.isChecked())
{
group.setSelected(true);
notifyDataSetChanged();
if(gpos!=grouplist.size()-1)
{
for(int i=0;i<group.getIndustry_Based_On_Group().size();i++)
{
if(i!=group.getIndustry_Based_On_Group().size()-1)
{
group.getIndustry_Based_On_Group().get(i).setSelected(true);
notifyDataSetChanged();
}
}
}
}else
{
group.setSelected(false);
notifyDataSetChanged();
if(gpos!=grouplist.size()-1)
{
for(int i=0;i<group.getIndustry_Based_On_Group().size();i++)
{
if(i!=group.getIndustry_Based_On_Group().size()-1)
{
group.getIndustry_Based_On_Group().get(i).setSelected(false);
notifyDataSetChanged();
}
}
}
}
}
});
if(group.getOtherText()!=null)
{
edtOther.setText(group.getOtherText());
}
edtOther.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
String text=edtOther.getText().toString();
group.setOtherText(text);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
return convertView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
public Industries_Level_3 getChild(int groupPosition, int childPosition) {
List<Industries_Level_3> ch = grouplist.get(groupPosition)
.getIndustry_Based_On_Group();
return ch.get(childPosition);
}
}
答案 0 :(得分:0)
由于您要回收convertView
(好!),您的getView()
需要将回收视图中的任何子视图重置为原始状态。
特别是,您可能需要添加类似
的内容edtOther.setText(null);
在findViewById()
初始edtOther
之后。
答案 1 :(得分:0)
尝试像这样膨胀convertView
:
if (convertView == null) {
convertView = inflater.inflate(R.layout.multilevel_list_item_child, parent, false);
}
修改强>
您的适配器上应该有一个私有类,如下所示:
private static class GroupHolder {
TextView groupName;
CheckBox chkSelect;
EditText edtOther;
}
然后,在你的getGroupView
上你应该有这样的东西:
GroupHolder holder;
if (convertView == null) {
holder = new GroupHolder();
convertView = inflater.inflate(layoutGroup, parent, false);
/* Initialize these three again like holder.groupName = convertView.findViewById...
TextView groupName;
CheckBox chkSelect;
EditText edtOther;
*/
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
}
// and then set fields like this holder.groupName.setText(//TODO);
答案 2 :(得分:0)
不幸的是我找不到解决这个问题的好方法。所以我改变了方法。而不是使用Edittext我使用了Button并给它一个像背景的edittext。在按钮的onclick上,Alertdialog会在那里输入值。选择确定后,键入的文本将设置为按钮。我认为这比在列表中使用edittext更好。
我使用此代码为按钮提供edittext背景。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape >
<solid android:color="#8C8F91" />
</shape>
</item>
<!-- main color -->
<item android:bottom="1dp"
android:left="1dp"
android:right="1dp">
<shape >
<solid android:color="#ffffff" />
</shape>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="6dp">
<shape >
<solid android:color="#ffffff" />
</shape>
</item>
</layer-list>
在buttonclick上显示alertdialog的代码:
btnOther.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// get prompts.xml view
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.layout_dialog, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set prompts.xml to alertdialog builder
alertDialogBuilder.setView(promptsView);
final EditText userInput = (EditText) promptsView
.findViewById(R.id.editTextDialogUserInput);
if(child.getOtherText()!=null)
{
userInput.setText(child.getOtherText().toString());
}
// set dialog message
alertDialogBuilder
.setCancelable(false)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
child.setOtherText(userInput.getText().toString());
notifyDataSetChanged();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
});
答案 3 :(得分:0)
您需要将ExpandableListView
layout_height
更改为&#34; match_parent
&#34;并确保始终在getChild(groupPosition, childPosition)
内调用getChildView
方法以获取数据的新副本。