【Android开发日记】LinearLayoutListView 解决ScrollView嵌套ListView无法自适应高度问题

本文详细记录了解决ScrollView内嵌ListView无法自动改变高度的问题,采用LinearLayoutListView作为解决方案。通过XML布局、Java代码以及Adapter的设置,展示了如何实例化并填充数据。还特别指出在更新数据时,LinearLayoutListView与ListView的不同之处。

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

需求:

ScrollView嵌套ListView的效果

问题:

ListView不能随viewitem的个数自动改变高度


网上有很多的办法来处理这个问题,但是LinearLayoutListView 也不失为一个好办法。


代码:

代码1:xml中调用LinearLayoutListView

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
     <com.think.read.LinearLayoutForListView
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent" android:id="@+id/iread_read_letter_comments">
    </com.think.read.LinearLayoutForListView>
</ScrollView>

代码2:LinearLayoutForListView.java

package ......;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

public class LinearLayoutForListView extends LinearLayout {

	private AdapterForLinearLayout adapter;
	private OnClickListener onClickListener = null;

	/**
	 * 
	 */
	public void bindLinearLayout() {
		int count = adapter.getCount();
		for (int i = 0; i < count; i++) {
			View v = adapter.getView(i, null, null);

			v.setOnClickListener(this.onClickListener);
			if (i == count - 1) {
				LinearLayout ly = (LinearLayout) v;
				ly.removeViewAt(2);
			}
			addView(v, i);
		}
		Log.v("countTAG", "" + count);
	}

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

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

	/**
	 * 
	 * 
	 * @return adapter
	 */
	public AdapterForLinearLayout getAdpater() {
		return adapter;
	}

	/**
	 *
	 * 
	 * @param adpater
	 */
	public void setAdapter(AdapterForLinearLayout adpater) {
		this.adapter = adpater;
		bindLinearLayout();
	}

	/**
	 * 
	 * 
	 * @return
	 */
	public OnClickListener getOnclickListner() {
		return onClickListener;
	}

	/**
	 * 
	 * 
	 * @param onClickListener
	 */
	public void setOnclickLinstener(OnClickListener onClickListener) {
		this.onClickListener = onClickListener;
	}
}

代码3:AdapterForLinearLayout

package .......;

import java.util.List;
import java.util.Map;

import com.think.R;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AdapterForLinearLayout extends BaseAdapter {

	private LayoutInflater mInflater;
	private List<? extends Map<String, ?>> data;
	private int resource;
	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);
	    }

	public int getCount() {
		return data.size();
	}

	public Object getItem(int position) {
		return data.get(position);
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup arg2) {
		convertView = mInflater.inflate(resource, null);
		final 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]);
			ImageView prisebtn = (ImageView)convertView.findViewById(R.id.iread_letterview_item_praisebtn);
			prisebtn.setOnClickListener(new OnClickListener(){
				@Override
	    		public void onClick(View v) {
	    			// TODO Auto-generated method stub
					Log.e("prasie", "你点了赞" + item.get("iread_letterview_item_usernickname"));
				}
			});
		}
		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());
		}
//		if (view instanceof ImageView) {
//			((ImageView) view).setOnClickListener(new OnClickListener(){
//				@Override
//	    		public void onClick(View v) {
//	    			// TODO Auto-generated method stub
//					Log.e("prasie", "你点了赞" + item.get("iread_letterview_item_usernickname"));
//				}
//			});
//		}
	}

}

代码4:LinearLayoutListView 子View :iread_read_listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/iread_letterview_item_0"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:background="#ffffff"
    android:orientation="vertical" >

     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="30dp"
         android:layout_marginLeft="15dp"
         android:layout_marginRight="15dp"
         android:orientation="horizontal" >

             <TextView
                 android:id="@+id/iread_letterview_item_usernickname"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="0dp"
                 android:layout_marginTop="7dp"
                 android:text="咸鱼"
                  android:layout_alignParentBottom= "true"
                 android:textColor="#000000"
                 android:textSize="14sp" />

             <TextView
                 android:id="@+id/iread_letterview_item_usermotto"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="10dp"
                 android:layout_toRightOf="@+id/iread_letterview_item_usernickname"
                 android:layout_alignParentBottom= "true"
                 android:text="有梦想的咸鱼"
                 android:textColor="#000000"
                 android:textSize="10.0sp" />
             
             <ImageView
                 android:id="@+id/iread_letterview_item_praisebtn"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:src="@drawable/iread_read_letter_comment_praise"
                 android:layout_toLeftOf="@+id/iread_letterview_item_praisenum"
                 android:layout_marginRight="5dp"
				 android:layout_alignParentBottom= "true"
                 >
             </ImageView>
             
             <TextView
                 android:id="@+id/iread_letterview_item_praisenum"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_alignParentBottom="true"
                 android:layout_alignParentRight="true"
                 android:layout_marginBottom="2dp"
                 android:layout_marginRight="5dp"
                 android:text="12"
                 android:textColor="#000000"
                 android:textSize="10.0sp" />

    </RelativeLayout> 
  
    		<TextView
    		    android:id="@+id/iread_letterview_item_note"
    		    android:layout_width="wrap_content"
    		    android:layout_height="wrap_content"
    		    android:layout_marginLeft="15dp"
    		    android:layout_marginRight="15dp"
    		    android:layout_marginTop="10dp"
    		    android:text="这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论这里写评论"
    		    android:textColor="#000000"
    		    android:textSize="12.0sp" />

    		<TextView
    		    android:id="@+id/iread_letterview_item_date"
    		    android:layout_width="wrap_content"
    		    android:layout_height="wrap_content"
    		    android:layout_gravity="right"
    		    android:layout_marginBottom="2dp"
    		    android:layout_marginRight="15dp"
    		    android:layout_marginTop="10dp"
    		    android:text="2014.7.1"
    		    android:textColor="#000000"
    		    android:textSize="10.0sp" />

  <RelativeLayout
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:orientation="horizontal" >

    		<View
    		    android:layout_width="fill_parent"
    		    android:layout_height="1dp"
    		    android:layout_marginLeft="15dp"
    		    android:layout_marginRight="15dp"
    		    android:background="#A9A9A9" />

   </RelativeLayout>

</LinearLayout>

代码5:dataList中的对象,即给子View布局的对象,包含不同数据类型的属性

package .....;

public class CommentItemInfo {
	
	private String usernickname;
	private String userid;
	private String usermotto;	
	private String date;
	private String note;
	//应该还有一个image

	public String getusernickname() {
		return usernickname;
	}
	public void setusernickname(String usernickname_) {
		this.usernickname = usernickname_;
	}
	
	public String getuserid() {
		return userid;
	}
	public void setuserid(String userid_) {
		this.userid = userid_;
	}
	
	public String getusermotto() {
		return usermotto;
	}
	public void setusermotto(String usermotto_) {
		this.usermotto = usermotto_;
	}
	
	public String getdate() {
		return date;
	}
	public void setdate(String date_) {
		this.date = date_;
	}
	
	public String getnote() {
		return note;
	}
	public void setnote(String note_) {
		this.note = note_;
	}
	
	
	
	public CommentItemInfo() {
		// TODO Auto-generated constructor stub
	}

	public CommentItemInfo(String usernickname,String date,String note,String userid,String usermotto){
		// TODO Auto-generated constructor stub
		this.usernickname = usernickname;
		this.userid = userid;
		this.usermotto = usermotto;
		this.date = date;
		this.note = note;
		
	}
}

根据我的需求,每个子View中

代码6:Activity中实例化LinearLayoutListView

private LinearLayoutForListView lv;
private AdapterForLinearLayout Layoutadpater;
lv = (LinearLayoutForListView)findViewById(R.id.iread_read_letter_comments);
datalist = new ArrayList<HashMap<String, Object>>();
//datalist 数据设置
Layoutadpater = new AdapterForLinearLayout(this, datalist,
	          R.layout.iread_read_listview_item, new String[] { "iread_letterview_item_usernickname", "iread_letterview_item_usermotto" ,"iread_letterview_item_praisenum","iread_letterview_item_note","iread_letterview_item_date"},
                  new int[] {R.id.iread_letterview_item_usernickname, R.id.iread_letterview_item_usermotto,R.id.iread_letterview_item_praisenum,R.id.iread_letterview_item_note,R.id.iread_letterview_item_date});
lv.setAdapter(Layoutadpater);


注意实例化适配器时的参数对应关系:

第一个参数:Context

第二个参数:List<? extends Map<String, ?>> data  对应 数据集,这里的dataList里面是自定义的对象,包含不同数据类型的属性

第三个参数:int resouce 对应 子View 的xml布局文件

第四个参数:String[] from 对应 子View的布局文件中的 控件的id名称集合

第五个参数:String[] from 对应 子View的布局文件中的 控件的id值集合


更改LinearLayoutListView中的数据:

1.增加: datalist.add()

2.清空:LinearLayoutListView.removeAllViews(),这里和ListView清空不太一样,ListView的Adapter适配的是List<View>,清空只用把装载view的List清空即可。而LinearLayoutListView是继承于LinearLayout而不是List,其添加子view是通过addview(),因此清空时只需用removeAllViews()即可。


附图:

1.LinearLayoutListView中 子View 在eclipse中的布局图示


2.效果图



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值