- 1、继承LinearLayout,既然会冲突那就不用ListView 改成线性布局做动态布局效果
- 2、继承BaseAdapter ,可以参照一下Android app源码中 Widget 目录下的SimpleAdapter 为前面扩展的LinearLayout做数据。
- 3、模拟数据填充扩展后的BaseAdapter 为扩展后的LinearLayout 加载数据
public
LinearLayoutForListView(Context context) {
super (context);
}
public LinearLayoutForListView(Context context, AttributeSet attrs) {
super (context, attrs);
// TODO Auto-generated constructor stub
}
super (context);
}
public LinearLayoutForListView(Context context, AttributeSet attrs) {
super (context, attrs);
// TODO Auto-generated constructor stub
}
/**
* 获取Adapter
*
* @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;
}
* 获取Adapter
*
* @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;
}
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);
}
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 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());
}
}
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());
}
}
- BindView 方法是一个自定义方法,在方法体内可以为通过判断使本类更具灵活性,如上,你不仅可以判断是TextView 并且可以传入任何你想要的View 只要在方法体内加入相应判断即可,数据可以通过data 做相应处理,具体如何操作读者可另行测试。
- convertView.setTag(position); 此句代码为View 设置tag 在以后我们可以通过 getTag 找出下标,后文有介绍如何通过下标操作数据。
package
com.terry.widget;
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);
// TODO Auto-generated constructor stub
}
/**
* 获取Adapter
*
* @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;
}
}
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);
// TODO Auto-generated constructor stub
}
/**
* 获取Adapter
*
* @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;
}
}
package
com.terry.widget;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
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());
}
}
}
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
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());
}
}
}
<?
xml version="1.0" encoding="UTF-8"
?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical" android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
< TextView android:id ="@+id/TextView01"
android:layout_marginLeft ="10px" android:textAppearance ="?android:attr/textAppearanceLarge"
android:layout_width ="wrap_content" android:layout_height ="wrap_content" >
</ TextView >
< TextView android:id ="@+id/TextView02" android:layout_width ="wrap_content"
android:textAppearance ="?android:attr/textAppearanceSmall"
android:layout_marginLeft ="10px" android:layout_height ="wrap_content" >
</ TextView >
< View android:layout_height ="1px" android:background ="#FFFFFF"
android:layout_width ="fill_parent" ></ View >
</ LinearLayout >
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical" android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
< TextView android:id ="@+id/TextView01"
android:layout_marginLeft ="10px" android:textAppearance ="?android:attr/textAppearanceLarge"
android:layout_width ="wrap_content" android:layout_height ="wrap_content" >
</ TextView >
< TextView android:id ="@+id/TextView02" android:layout_width ="wrap_content"
android:textAppearance ="?android:attr/textAppearanceSmall"
android:layout_marginLeft ="10px" android:layout_height ="wrap_content" >
</ TextView >
< View android:layout_height ="1px" android:background ="#FFFFFF"
android:layout_width ="fill_parent" ></ View >
</ LinearLayout >
- XML如下:
< com.terry.widget.LinearLayoutForListView
android:orientation ="vertical" android:layout_width ="450px"
android:layout_height ="fill_parent" android:id ="@+id/ListView01" >
</ com.terry.widget.LinearLayoutForListView > - 加载数据如下:
lv = (LinearLayoutForListView) findViewById(R.id.ListView01);
for ( int i = 0 ; i < 10 ; i ++ ) {
HashMap < String, Object > map = new HashMap < String, Object > ();
map.put( " key_name " , " name " + i);
map.put( " value_name " , " value " + i);
list.add(map);
}
final AdapterForLinearLayout Layoutadpater = new AdapterForLinearLayout(
this , list, R.layout.test, new String[] { " key_name " ,
" value_name " }, new int [] { R.id.TextView01,
R.id.TextView02 }); - 事件操作,并通过下标得到数据源:
lv.setOnclickLinstener( new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(
BlueToothActivity. this ,
Layoutadpater.get(Integer.parseInt(v.getTag()
.toString()), " key_name " ), 1000 ).show();
}
});
lv.setAdapter(Layoutadpater);