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

来源:互联网 发布:10.11.4制作mac安装u盘 编辑:程序博客网 时间:2024/05/22 10:51

需求:

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.LinearLayoutForListViewandroid: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 stubLog.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;//应该还有一个imagepublic 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 stubthis.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.效果图



0 0
原创粉丝点击