scrollview 和listview共存问题

当ScrollView和ListView共同存在时,会遇到ListView高度无效及滚动冲突的问题。为解决这些问题,可以自定义ListView,扩展LinearLayout,并重新计算ListView的高度,确保两者能够正确共存。这种方法适用于需要在ScrollView中展示多行ListView数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共存问题:


1.listview高度无效,需要重新计算,可以和scrollview共存。

  2.两个都有滚动事件,这时不能共存;要想使用scrollview,可以自定义listview,扩展linearlayout。


两者都可以滑动,共存时listview只能显示一行数据,这时需要重新计算listview的高度

一、在布局中写死listview的高度,虽然能显示多行,对于海量数据并不适合。

二、自定义listview

publicclassMyListViewextendsListView {
 
    publicMyListView(Context context) {
        super(context);
    }
    publicMyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    publicMyListView(Context context, AttributeSet attrs,
            intdefStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {
        intexpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2
                MeasureSpec.AT_MOST); 
        super.onMeasure(widthMeasureSpec, expandSpec); 
    }
 
}
三、重新设置listview的高度,并在填充adapter(setAdapter())后调用
publicvoidsetListViewHeightBasedOnChildren(ListView listView) { 
   ListAdapter listAdapter = listView.getAdapter();  
   if(listAdapter == null) { 
       return
   }
   inttotalHeight = 0
   for(inti = 0; i < listAdapter.getCount(); i++) { 
       View listItem = listAdapter.getView(i, null, listView); 
       listItem.measure(0,0); 
       totalHeight += listItem.getMeasuredHeight(); 
   }
   ViewGroup.LayoutParams params = listView.getLayoutParams(); 
   params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
   ((MarginLayoutParams)params).setMargins(10,10,10,10);
   listView.setLayoutParams(params); 
}

四、自定义listview,扩展linearlayout
 public class AdapterForLinearLayout extends BaseAdapter {


    private LayoutInflater mInflater;
    private int resource;
    private List<? extends Map<String, ?>> data;
    private String[] from;
    private int[] to;


    public AdapterForLinearLayout(Context context,
            List<? extends Map<String, ?>> data, int resouce, String[] from,
            int[] to) {
        this.data = data;
        this.resource = resouce;
        this.data = data;
        this.from = from;
        this.to = to;
        this.mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }


    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return data.get(position);
    }


    @SuppressWarnings("unchecked")
    public String get(int position, Object key) {
        Map<String, ?> map = (Map<String, ?>) getItem(position);
        return map.get(key).toString();
    }


    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub


        convertView = mInflater.inflate(resource, null);
        Map<String, ?> item = data.get(position);
        int count = to.length;
        for (int i = 0; i < count; i++) {
            View v = convertView.findViewById(to[i]);
            bindView(v, item, from[i]);
        }
        convertView.setTag(position);
        return convertView;
    }


    /**
     * 绑定视图
     * @param view
     * @param item
     * @param from
     */
    private void bindView(View view, Map<String, ?> item, String from) {
        Object data = item.get(from);
        if (view instanceof TextView) {
            ((TextView) view).setText(data == null ? "" : data.toString());
        }
    }
}
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值