在Expandablelistview中将文本设置为edittext的问题

时间:2015-01-14 08:31:04

标签: android android-edittext expandablelistview

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

4 个答案:

答案 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方法以获取数据的新副本。