java - android 单选题 listview嵌套 listview。

 喜生-Da 发布于 2022-10-26 17:52

我有个做选择题的需求,界面样式如下图

我通过listview嵌套listview来实现,子listview的item是一个实现

我的父listview的item如下,设置了listview的android:choiceMode="singleChoice"




    

    

子listview的item如下,其中CheckableLinearLayout是实现重写Linearlayout实现Checkable接口的自定义View
xml:




    

    

    

CheckableLinearLayout:

public class CheckableLinearLayout extends LinearLayout implements Checkable{
    public boolean mChecked = false;
    public CheckableLinearLayout(Context context, AttributeSet attrs,
                                int defStyle) {
        super(context, attrs, defStyle);
    }

    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckableLinearLayout(Context context) {
        super(context);
    }

    @Override
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
            for (int i = 0, len = getChildCount(); i < len; i++) {
                View child = getChildAt(i);
                if(child instanceof Checkable){
                    ((Checkable) child).setChecked(checked);
                }
            }
        }
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }
}

父Adapter:

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.assess_parent_list_item, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvParentName.setText(key.get(position));
        //innerlistview 的adapter
        List ratingLists = map.get(key.get(position));
        AssessChildAdapter adapter = new AssessChildAdapter(ratingLists, mContext);
        holder.lvInner.setAdapter(adapter);
        int pos=holder.lvInner.getCheckedItemPosition();
        MLog.e(pos);
        if(pos==-1){
            holder.lvInner.setItemChecked(0, true);
        }else{
            holder.lvInner.setItemChecked(holder.lvInner.getCheckedItemPosition(),true);
        }

        int selectedPos=holder.lvInner.getCheckedItemPosition();
        setSelected(selectedPos,ratingLists.get(selectedPos));

        //根据innerlistview的高度机损parentlistview item的高度
        setListViewHeightBasedOnChildren(holder.lvInner);

        return convertView;
    }
    

子Adapter:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.assess_child_list_item, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.tvChildName.setText(ratingLists.get(position).getDescription());
        viewHolder.tvChildScore.setText(ratingLists.get(position).getScore() + "");

        return convertView;
    }
        

希望有人帮忙看下,万分感谢

4 个回答
  • @大尾巴狼 说的那个方法比较适合有折叠场景的应用, 看题主截图, 应该直接用ListView就可以实现: 重写BaseAdapter中的两个接口:

    • [1] int getViewTypeCount()

    • [2] int getItemViewType(int position)

    [1] 告诉ListView有多少个视图类型, 以便ListView重用子视图, [2]告诉ListView当前position位置使用哪个子视图.

    可以直接查百度查谷歌获得更多实例.

    p.s. 当然也可以不用上述接口来实现, 直接控制视图的显示隐藏更方便

    2022-10-27 01:07 回答
  • ExpandListView就是listview嵌套listview的啊,而且已经封装好父和子Listview

    2022-10-27 01:07 回答
  • 很多人可能并不懂得ListView是为了解决什么问题,并不是有列表就要用 ListView。

    ListView的目标是长列表,即列表的item数量众多,阵列起来有可能是五屏、十屏、二十屏。ListView的基本原理就是只加载当前可视的item,这样就保证了性能(试想想一次性加载上千个item)。

    对于你这样的需求,只需要一个ListView,里面的每一个item的 选项部分 用 LinearLayout 然后和 ListView 一样动态加载数据就可以了,因为选项不太可能有成百上千条。

    2022-10-27 01:07 回答
  • 根据你的布局来看, 我建议你用ExpandListView来做. 比较方便吧!

    2022-10-27 01:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有