需求:
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.效果图