【问题标题】:Android ExpandableListView using Holder for childViews with SeekBar. childViews are interdependingAndroid ExpandableListView 使用 Holder for childViews with SeekBar。 childViews 是相互依赖的
【发布时间】:2014-07-27 22:59:53
【问题描述】:

我正在尝试使用 ExpendableListView 实现布局。有 4 个组元素,每个组有 2 个孩子。第一个组元素确实有 0 个子元素。

G
G
 C
 C
G
 C
 C
G
 C
 C

每个组元素都有 2 个 TextView、1 个 ImageView 和 1 个 Switch。 每个子元素都有 2 个 TextView 和 1 个 SeekBar。

适配器包含 2 个支架。一个用于 Groupviews,一个用于 Childviews。

在组层上,一切都按预期工作。

但是在子层上,不同的 ChildView 是相互依赖的。例如设置 Group Element3/Child Element1 的 SeekBar 也会设置 Group Element1/Child Element0 的 SeekBar。

我确实理解这个问题与缺少视图的唯一性和 Android 的视图处理(优化)有关。

这里是getChildView方法:

@Override
public View getChildView(int groupPosition, int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) {

final int tempgroupPos = groupPosition;
final int tempchildPos = childPosition;

ChildViewHolder cviewHolder = null; 

if (convertView == null) {  
    convertView = inflater.inflate(R.layout.interfaces_listrow_details_intervall, null);

    cviewHolder  = new ChildViewHolder();

    cviewHolder.tvb = (TextView) convertView.findViewById(R.id.interfaces_child_intervall_textbig);
    cviewHolder.tvs = (TextView) convertView.findViewById(R.id.interfaces_child_intervall_textexplanation);
    cviewHolder.sb = (SeekBar) convertView.findViewById(R.id.interfacesSeekBar);

    cviewHolder.sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {

            int getPosition = (Integer) seekBar.getTag();   

            clist.get(tempgroupPos).get(tempchildPos).setProgress(seekBar.getProgress());

            // do stuff

            notifyDataSetChanged();
        }
    });

    convertView.setTag(cviewHolder);

    convertView.setTag(R.id.interfaces_child_intervall_textbig, cviewHolder.tvb);
    convertView.setTag(R.id.interfaces_child_intervall_textexplanation, cviewHolder.tvs);
    convertView.setTag(R.id.interfacesSeekBar, cviewHolder.sb);

} else {
    cviewHolder = (ChildViewHolder) convertView.getTag();
}

cviewHolder.sb.setTag(groupPosition);
cviewHolder.sb.setProgress(clist.get(groupPosition).get(childPosition).getProgress());

cviewHolder.tvb.setText(clist.get(groupPosition).get(childPosition).getBigText());  
cviewHolder.tvs.setText(clist.get(groupPosition).get(childPosition).getSmallTextActivated());

return convertView;
}

如果您需要代码的任何其他部分或其他信息,请询问。

我查看了这些问题/答案,但它们并没有真正帮助我个人。

【问题讨论】:

  • ChildViewHolder 中的视图是否声明为静态?此外,在SeekBar 设置进度之后,将侦听器设置在if 子句之外。
  • 你能告诉我什么是clist吗?特别是这一行 clist.get(tempgroupPos).get(tempchildPos).setProgress(seekBar.getProgress());
  • 哇,我不习惯这么快的答案。对不起。 @Luksprog ChildViewHolder 中的视图被声明为具有受保护变量的静态类。我现在已经在 if 子句之外设置了监听器。 /// clist 是“私有最终 List> clist;”。它应该保存视图元素的文本和进度值。这里它包含 3 个 List 对象和 2 个 Model 对象本身。 1 个模型包含 1 个 ListView 元素的字符串和值。

标签: android expandablelistview childviews


【解决方案1】:

好的。此外,我不确定为什么这种方法行不通,我再次查看了发布的 Q/A 链接。我选择了这个

Android - Expandable ListView - using ViewHolder for optimization

并严格遵循所有内容。现在它就是这样工作的。我非常关注我的第一个选择的例子。谢谢你。我的代码现在正在运行。这是代码供其他人参考。

ChildViewHolder:

// https://stackoverflow.com/questions/22583689/android-expandable-listview-using-viewholder-for-optimization
static class ChildViewHolder {
    private HashMap<Integer, View> storedViews = new HashMap<Integer, View>();


    public ChildViewHolder addView(View view)
    {
        int id = view.getId();
        storedViews.put(id, view);
        return this;
    }

    public View getView(int id)
    {
        return storedViews.get(id);
    }
}

getChildView 方法:

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

    final int tempgroupPos = groupPosition;
    final int tempchildPos = childPosition;

    View row = convertView;
    if (row == null)
    {
        row = inflater.inflate(R.layout.interfaces_listrow_details_intervall, parent, false);

        TextView tvb = (TextView) row.findViewById(R.id.interfaces_child_intervall_textbig);
        TextView tvs = (TextView) row.findViewById(R.id.interfaces_child_intervall_textexplanation);
        SeekBar sb = (SeekBar) row.findViewById(R.id.interfacesSeekBar);

        ChildViewHolder cholder = new ChildViewHolder();

        cholder.addView(tvb);
        cholder.addView(tvs);
        cholder.addView(sb);

        row.setTag(cholder);
    }

    ChildViewHolder cholder = (ChildViewHolder) row.getTag();
    TextView tvb = (TextView) cholder.getView(R.id.interfaces_child_intervall_textbig);
    TextView tvs = (TextView) cholder.getView(R.id.interfaces_child_intervall_textexplanation);
    SeekBar sb = (SeekBar) cholder.getView(R.id.interfacesSeekBar);

    sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub  
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {

            Globals g = Globals.getInstance();
            clist.get(tempgroupPos-1).get(tempchildPos).setProgress(seekBar.getProgress());

            // do something
            notifyDataSetChanged();
        }
    });

    tvb.setText(clist.get(groupPosition-1).get(childPosition).getBigText());
    tvs.setText(clist.get(groupPosition-1).get(childPosition).getSmallTextActivated());
    sb.setProgress(clist.get(groupPosition-1).get(childPosition).getProgress());

    return row;
}

【讨论】:

    【解决方案2】:

    本教程是关于 android 中的可扩展列表视图,它有助于在组中显示数据。您可以在您的活动中创建多个列表视图,这些列表视图可以在点击事件时展开。 Android Expandable listview 的主要思想是它有组,每个组都有一些子。可以通过单击来扩展和回避群组。

    可扩展列表视图主要用于分组显示数据。普通列表视图和列表视图的主要区别在于它允许两个级别:组和子级(组单独展开)。 欲了解更多信息结帐http://techlovejump.com/android-expandable-listview-tutorial/

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多