1

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

G
G
 C
 C
G
 C
 C
G
 C
 C

每个 Group Element 有 2 个 TextViews、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;
}

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

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

4

2 回答 2

1

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

Android - Expandable ListView - 使用 ViewHolder 进行优化

并准确地遵循了一切。现在它就是这样工作的。我非常关注我的第一个选择的例子。谢谢你。我的代码现在正在运行。这是其他人参考的代码。

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;
}
于 2014-06-07T02:11:16.710 回答
-1

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

Expandable List 视图主要用于分组显示数据。普通列表视图和列表视图的主要区别在于,它允许两个级别:组和子级(组单独展开)。有关更多信息,请查看http://techlovejump.com/android-expandable-listview-tutorial/

于 2014-11-29T08:21:31.033 回答