【问题标题】:EditTextView contents duplicated when used as an expandablelistview child用作可扩展列表视图子项时重复的 EditTextView 内容
【发布时间】:2017-08-05 18:20:40
【问题描述】:

我有一个 ExpandableListView,它使用几个 EditTextViews 作为子项,如下所示:

问题是当我在 EditText 字段之一中输入内容并关闭组时,内容会在单独的组中或有时在两个组中重复。

我的适配器只返回固定数量的子视图,代码如下:

public class MyAdapter extends BaseExpandableListAdapter {
    @Override
    public int getGroupCount() {
        return 3;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 1;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }

    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        //Inflate layout and return rowView

        return rowView;
    }

    @Override
    public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //Inlfate layout and return rowView
        return rowView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
}

我尝试使用 ViewHolder 并得到相同的结果。我需要做些什么来防止内容被复制?

【问题讨论】:

    标签: android expandablelistview expandablelistadapter


    【解决方案1】:

    我意识到ExpandableListView 的问题是每次展开子视图时都会调用 getChildView。这会导致视图被重用。

    为了解决这个问题,我通过膨胀子视图布局并创建一个 HashMap 来存储 EditText 的值来禁用视图回收

    private  String title;
    
    private  HashMap<String, String> holder = new HashMap<>();
    
    public MyAdapter(String title){
        this.title = title;
    }
    

    然后在 getChildView 方法中我执行以下操作:

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_child, parent, false);
    
        final EditText etFirstName = (EditText) convertView.findViewById(R.id.et_first_name);
        final String value =  holder.get(String.valueOf(groupPosition + childPosition));
    
        etFirstName.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) {
                holder.put(String.valueOf(groupPosition + childPosition), s.toString());
            }
        });
    
        if (value != null){
            etFirstName.setText(value);
        }
    
        return convertView;
    }
    

    要对多个视图执行相同的操作,您可以创建一个模型对象并将groupPosition + childPosition 用作HashMap 的键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多