【问题标题】:Expandable listview - disable recycling of views可扩展列表视图 - 禁用视图回收
【发布时间】:2014-07-23 10:16:08
【问题描述】:

由于 Android 的回收政策,我在 Android 中使用可扩展列表视图,并且在子项中的交互式 EditTexts 存在巨大问题。

我想知道是否可以以某种方式禁用这种回收(那里不会有太多元素,所以性能应该不是问题)?

问题是 EditTexts 中有重复项,即如果我在第一个 EditText 中输入内容,则可能在其他一些 EditText 中出现相同的文本,或者如果我折叠并展开一个组,则字符串EditTexts 经常混淆。

按照我的代码:

编辑:

@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildItem item = getChild(groupPosition, childPosition);
    String comment = "";
    state = getStatelist().get(groupPosition);

    if (convertView == null) {
        holder = new ChildHolder();           
        convertView = inflater.inflate(R.layout.childitem_list_item, parent, false);
        holder.title = (EditText) convertView.findViewById(R.id.textTitle);          
        convertView.setTag(holder);
    } else {
        holder = (ChildHolder) convertView.getTag();
    }

    if(state.commentList != null){
        holder.title.setText(state.commentList[childPosition]);
    }
    else{
        holder.title.setText("");
    }

    holder.title.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            state = getStatelist().get(groupPosition);

            state.commentList[childPosition] = s.toString();                

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}


public class States {

  public String code = "";
  public String name = "";
  public String[] commentList;
 }

【问题讨论】:

  • 简单地忽略非空convertView(每次构建行视图)不起作用?
  • 不幸的是它没有;因为我使用的是 EditTexts,所以当我不使用 viewHolder 模式时会出现重复的条目。
  • 如果你正确设置数据,我看不出你会有重复。我只是在谈论 convertView 而不是 ViewHolder 模式。
  • @Luksprog 请检查我编辑的问题。
  • 如果您想拥有 EditText 字段,请不要使用 ListViews。请改用线性布局。就这么简单。

标签: android expandablelistview recycle


【解决方案1】:

你有两个不同的问题。您想要的是在每次重建中清除编辑文本的值。所以你可以改变

  if(state.commentList != null){
        holder.title.setText(state.commentList[childPosition]);
    }
    else{
        holder.title.setText("");
    }

进入

holder.title.setText("");
  if(state.commentList != null){
        holder.title.setText(state.commentList[childPosition]);
    }

现在,如果您真正想要的是删除视图回收,只需让 convertview 始终重新充气

state = getStatelist().get(groupPosition);
holder = new ChildHolder();           
convertView = inflater.inflate(R.layout.childitem_list_item, parent, false);
holder.title = (EditText) convertView.findViewById(R.id.textTitle);          
convertView.setTag(holder);
holder = (ChildHolder) convertView.getTag();
// You can remove the viewholder pattern because you're not using it anymore
if(state.commentList != null){

【讨论】:

  • 有趣,每次都放大视图似乎有效,但现在我必须触摸 EditText 两次,直到它获得焦点。怎么会?
  • 我没有足够的信息来回答这个问题。
  • 如果我每次都只是简单地放大视图,当我单击其中一个 EditText 时,光标会出现一小会儿,然后出现键盘并且 EditText 失去焦点。然后我必须再次触摸 EditText 才能输入内容。
  • 我不知道您的布局、活动/片段或触摸/编辑文本侦听器如何,我无法从行为描述中推断出来。
  • 我的布局不包含任何有趣的东西,只是常规设置,没有像“android:beforeDescdencants”之类的东西,唯一的 EditText 监听器是我在我的问题中发布的那个(addTextChangeListener)。
猜你喜欢
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多