原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lichen.blog.51cto.com/697816/492200
Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.
根据数据来源形式的不同可以选择不同的Adapter,比如数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter.
使用simpleadapter的例子:
主布局文件
<!--main.xml-->
<?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"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<Spinner
android:id="@+id/subway_lines"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Spinner>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/subway_lines"
android:layout_alignLeft="@id/subway_lines"
android:id="@+id/select_line"
/>
</RelativeLayout>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/station_listView"
/>
</LinearLayout>
<?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"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<Spinner
android:id="@+id/subway_lines"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Spinner>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/subway_lines"
android:layout_alignLeft="@id/subway_lines"
android:id="@+id/select_line"
/>
</RelativeLayout>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/station_listView"
/>
</LinearLayout>
<!--stationitem.xml-->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="200px"
android:layout_height="fill_parent"
android:textSize="20px"
android:gravity="center_horizontal"
android:id="@+id/station_name"
/>
<TextView
android:layout_width="200px"
android:layout_height="fill_parent"
android:layout_toRightOf="@id/station_name"
android:textSize="20px"
android:layout_alignTop="@id/station_name"
android:id="@+id/station_info"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="200px"
android:layout_height="fill_parent"
android:textSize="20px"
android:gravity="center_horizontal"
android:id="@+id/station_name"
/>
<TextView
android:layout_width="200px"
android:layout_height="fill_parent"
android:layout_toRightOf="@id/station_name"
android:textSize="20px"
android:layout_alignTop="@id/station_name"
android:id="@+id/station_info"
/>
</RelativeLayout>
import java.util.ArrayList;
public class SubwayActivity extends Activity {
private static final String TAG = "SubwayActivity";
private SubwayService subwayService;
private TextView selectLine;
private Spinner subwayLines;
private ArrayAdapter<String> linesAdapter;
private List<String> linesNames;
private ListView stationListView;
private SimpleAdapter stationsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
stationListView = (ListView) findViewById(R.id.station_listView);
subwayService = new SubwayService(this);
//初始化数据
// subwayService.init();
List<SubwayLine> listLines = subwayService.getLineScrollData();
linesNames = new ArrayList<String>();
for (SubwayLine subwayLine : listLines) {
linesNames.add(subwayLine.getLineName());
}
// 第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项
selectLine = (TextView) findViewById(R.id.select_line);
subwayLines = (Spinner) findViewById(R.id.subway_lines);
// 第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
linesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,linesNames);
// 第三步:为适配器设置下拉列表下拉时的菜单样式。
linesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 第四步:将适配器添加到下拉列表上
subwayLines.setAdapter(linesAdapter);
//第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中
subwayLines.setOnItemSelectedListener(selectedListener);
/*下拉菜单弹出的内容选项触屏事件处理*/
subwayLines.setOnTouchListener(onTouchListener);
/*下拉菜单弹出的内容选项焦点改变事件处理*/
subwayLines.setOnFocusChangeListener(onFocusChangeListener);
}
/**
* 为下拉列表设置各种事件的响应,这个事响应菜单被选中
*/
private OnItemSelectedListener selectedListener = new Spinner.OnItemSelectedListener(){
@SuppressWarnings("unchecked")
public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) {
String lineName = linesAdapter.getItem(arg2);
SubwayLine line = subwayService.findLine(lineName);
/*根据lineId查询出stations*/
List<SubwayStation> stations = subwayService.getStationLineScrollData(line.getLineId());
/*把stations的属性值放到List<HashMap<String, String>>中*/
List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
for (SubwayStation station : stations) {
HashMap<String, String> map = new HashMap<String, String>();
if(station.getIsChange() == 1){
map.put("stationName", station.getStationName());
List<SubwayStation> changeStations = subwayService.getChangeStationExceptThis(station.getStationName(), line.getLineId());
StringBuilder builder = new StringBuilder();
builder.append("换乘 ");
if(changeStations != null && changeStations.size() > 0){
for (SubwayStation changeStation : changeStations) {
SubwayLine changeLine = subwayService.findLine(changeStation.getLineId());
builder.append(changeLine.getLineName()).append(",");
}
builder.deleteCharAt(builder.length()-1);
}
map.put("stationInfo",builder.toString());
}else{
map.put("stationName", station.getStationName());
map.put("stationInfo", station.getStationInfo());
}
data.add(map);
}
/*设置stationsAdapter适配器*/
stationsAdapter = new SimpleAdapter(
SubwayActivity.this,
data,
R.layout.stationitem,
new String[] { "stationName", "stationInfo" },
new int[] { R.id.station_name, R.id.station_info });
stationListView.setAdapter(stationsAdapter);
/* 将所选mySpinner 的值带入myTextView 中*/
selectLine.setText("以下是:"+ lineName +" 车站列表...");
/* 将mySpinner 显示*/
arg0.setVisibility(View.VISIBLE);
}
@SuppressWarnings("unchecked")
public void onNothingSelected(AdapterView arg0) {
selectLine.setText("");
arg0.setVisibility(View.VISIBLE);
}
};
/**
* 下拉菜单弹出的内容选项触屏事件处理
*/
private OnTouchListener onTouchListener = new Spinner.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
/* 将mySpinner 隐藏,不隐藏也可以,看自己爱好*/
// v.setVisibility(View.INVISIBLE);
return false;
}
};
/**
* 下拉菜单弹出的内容选项焦点改变事件处理
*/
private OnFocusChangeListener onFocusChangeListener = new Spinner.OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
v.setVisibility(View.VISIBLE);
}
};
}
public class SubwayActivity extends Activity {
private static final String TAG = "SubwayActivity";
private SubwayService subwayService;
private TextView selectLine;
private Spinner subwayLines;
private ArrayAdapter<String> linesAdapter;
private List<String> linesNames;
private ListView stationListView;
private SimpleAdapter stationsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
stationListView = (ListView) findViewById(R.id.station_listView);
subwayService = new SubwayService(this);
//初始化数据
// subwayService.init();
List<SubwayLine> listLines = subwayService.getLineScrollData();
linesNames = new ArrayList<String>();
for (SubwayLine subwayLine : listLines) {
linesNames.add(subwayLine.getLineName());
}
// 第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项
selectLine = (TextView) findViewById(R.id.select_line);
subwayLines = (Spinner) findViewById(R.id.subway_lines);
// 第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
linesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,linesNames);
// 第三步:为适配器设置下拉列表下拉时的菜单样式。
linesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 第四步:将适配器添加到下拉列表上
subwayLines.setAdapter(linesAdapter);
//第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中
subwayLines.setOnItemSelectedListener(selectedListener);
/*下拉菜单弹出的内容选项触屏事件处理*/
subwayLines.setOnTouchListener(onTouchListener);
/*下拉菜单弹出的内容选项焦点改变事件处理*/
subwayLines.setOnFocusChangeListener(onFocusChangeListener);
}
/**
* 为下拉列表设置各种事件的响应,这个事响应菜单被选中
*/
private OnItemSelectedListener selectedListener = new Spinner.OnItemSelectedListener(){
@SuppressWarnings("unchecked")
public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) {
String lineName = linesAdapter.getItem(arg2);
SubwayLine line = subwayService.findLine(lineName);
/*根据lineId查询出stations*/
List<SubwayStation> stations = subwayService.getStationLineScrollData(line.getLineId());
/*把stations的属性值放到List<HashMap<String, String>>中*/
List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
for (SubwayStation station : stations) {
HashMap<String, String> map = new HashMap<String, String>();
if(station.getIsChange() == 1){
map.put("stationName", station.getStationName());
List<SubwayStation> changeStations = subwayService.getChangeStationExceptThis(station.getStationName(), line.getLineId());
StringBuilder builder = new StringBuilder();
builder.append("换乘 ");
if(changeStations != null && changeStations.size() > 0){
for (SubwayStation changeStation : changeStations) {
SubwayLine changeLine = subwayService.findLine(changeStation.getLineId());
builder.append(changeLine.getLineName()).append(",");
}
builder.deleteCharAt(builder.length()-1);
}
map.put("stationInfo",builder.toString());
}else{
map.put("stationName", station.getStationName());
map.put("stationInfo", station.getStationInfo());
}
data.add(map);
}
/*设置stationsAdapter适配器*/
stationsAdapter = new SimpleAdapter(
SubwayActivity.this,
data,
R.layout.stationitem,
new String[] { "stationName", "stationInfo" },
new int[] { R.id.station_name, R.id.station_info });
stationListView.setAdapter(stationsAdapter);
/* 将所选mySpinner 的值带入myTextView 中*/
selectLine.setText("以下是:"+ lineName +" 车站列表...");
/* 将mySpinner 显示*/
arg0.setVisibility(View.VISIBLE);
}
@SuppressWarnings("unchecked")
public void onNothingSelected(AdapterView arg0) {
selectLine.setText("");
arg0.setVisibility(View.VISIBLE);
}
};
/**
* 下拉菜单弹出的内容选项触屏事件处理
*/
private OnTouchListener onTouchListener = new Spinner.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
/* 将mySpinner 隐藏,不隐藏也可以,看自己爱好*/
// v.setVisibility(View.INVISIBLE);
return false;
}
};
/**
* 下拉菜单弹出的内容选项焦点改变事件处理
*/
private OnFocusChangeListener onFocusChangeListener = new Spinner.OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
v.setVisibility(View.VISIBLE);
}
};
}
/*设置stationsAdapter适配器*/
stationsAdapter = new SimpleAdapter(
SubwayActivity.this,
data,
R.layout.stationitem,
new String[] { "stationName", "stationInfo" },
new int[] { R.id.station_name, R.id.station_info });
stationListView.setAdapter(stationsAdapter);
stationsAdapter = new SimpleAdapter(
SubwayActivity.this,
data,
R.layout.stationitem,
new String[] { "stationName", "stationInfo" },
new int[] { R.id.station_name, R.id.station_info });
stationListView.setAdapter(stationsAdapter);
===========================================================
以上是简单的使用adapter的方法,一般情况下这样就够用了.接下来是自定义adapter.
继承BaseAdapter,重写四个方法.
public class WeatherAdapter extends BaseAdapter {
private Context context;
private List<Weather> weatherList; //这就是adapter关联的List,用来存储数据.还记的ArrayList
public WeatherAdapter(Context context, List<Weather> weatherList ) {
this.context = context;
this.weatherList = weatherList;
}
public int getCount() {
return weatherList.size();
}
public Object getItem(int position) {
return weatherList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
Weather weather = weatherList.get(position);
return new WeatherAdapterView(this.context, weather );
}
}
private Context context;
private List<Weather> weatherList; //这就是adapter关联的List,用来存储数据.还记的ArrayList
public WeatherAdapter(Context context, List<Weather> weatherList ) {
this.context = context;
this.weatherList = weatherList;
}
public int getCount() {
return weatherList.size();
}
public Object getItem(int position) {
return weatherList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
Weather weather = weatherList.get(position);
return new WeatherAdapterView(this.context, weather );
}
}
自定义的View
class WeatherAdapterView extends LinearLayout {
public static final String LOG_TAG = "WeatherAdapterView";
public WeatherAdapterView(Context context,
Weather weather ) {
super( context );
this.setOrientation(HORIZONTAL);
LinearLayout.LayoutParams cityParams =
new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT);
cityParams.setMargins(1, 1, 1, 1);
TextView cityControl = new TextView( context );
cityControl.setText( weather.getCity() );
addView( cityControl, cityParams);
LinearLayout.LayoutParams temperatureParams =
new LinearLayout.LayoutParams(20, LayoutParams.WRAP_CONTENT);
temperatureParams.setMargins(1, 1, 1, 1);
TextView temperatureControl = new TextView(context);
temperatureControl.setText( Integer.toString( weather.temperature ) );
addView( temperatureControl, temperatureParams);
LinearLayout.LayoutParams skyParams =
new LinearLayout.LayoutParams(25, LayoutParams.WRAP_CONTENT);
ImageView skyControl = new ImageView( context );
Log.d( LOG_TAG, weather.getCity()+" -> "+weather.sky );
skyControl.setImageResource( weather.getSkyResource() );
addView( skyControl, skyParams );
}
}
public static final String LOG_TAG = "WeatherAdapterView";
public WeatherAdapterView(Context context,
Weather weather ) {
super( context );
this.setOrientation(HORIZONTAL);
LinearLayout.LayoutParams cityParams =
new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT);
cityParams.setMargins(1, 1, 1, 1);
TextView cityControl = new TextView( context );
cityControl.setText( weather.getCity() );
addView( cityControl, cityParams);
LinearLayout.LayoutParams temperatureParams =
new LinearLayout.LayoutParams(20, LayoutParams.WRAP_CONTENT);
temperatureParams.setMargins(1, 1, 1, 1);
TextView temperatureControl = new TextView(context);
temperatureControl.setText( Integer.toString( weather.temperature ) );
addView( temperatureControl, temperatureParams);
LinearLayout.LayoutParams skyParams =
new LinearLayout.LayoutParams(25, LayoutParams.WRAP_CONTENT);
ImageView skyControl = new ImageView( context );
Log.d( LOG_TAG, weather.getCity()+" -> "+weather.sky );
skyControl.setImageResource( weather.getSkyResource() );
addView( skyControl, skyParams );
}
}
最后在Activity中使用
public class CustomAdapterActivity extends ListActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<Weather> weatherList = new ArrayList<Weather>();
Weather w = new Weather( "London", 17, Weather.OVERCAST );
weatherList.add( w );
w = new Weather( "Paris", 22, Weather.OVERCAST );
weatherList.add( w );
w = new Weather( "Athens", 29, Weather.SUNNY );
weatherList.add( w );
w = new Weather( "Stockholm", 12, Weather.RAIN );
weatherList.add( w );
WeatherAdapter weatherAdapter = new WeatherAdapter(
this,
weatherList );
setListAdapter( weatherAdapter );
}
}
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<Weather> weatherList = new ArrayList<Weather>();
Weather w = new Weather( "London", 17, Weather.OVERCAST );
weatherList.add( w );
w = new Weather( "Paris", 22, Weather.OVERCAST );
weatherList.add( w );
w = new Weather( "Athens", 29, Weather.SUNNY );
weatherList.add( w );
w = new Weather( "Stockholm", 12, Weather.RAIN );
weatherList.add( w );
WeatherAdapter weatherAdapter = new WeatherAdapter(
this,
weatherList );
setListAdapter( weatherAdapter );
}
}
===========================================================
再就是Adapter的优化,一个广为流传的 ViewHolder、ViewCache办法:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
或者使用HashMap做缓存的方法:
HashMap<Integer, View> m = new HashMap<Integer, View>();
public View getView(int position, View view, ViewGroup parent) {
View convertView = m.get(position);
if (convertView != null) {
return convertView;
} else {
convertView = inflater.inflate(R.layout.topic_list, null);
TextView title = (TextView) convertView.findViewById(R.id.title);
m.put(position, convertView);
}
}
public View getView(int position, View view, ViewGroup parent) {
View convertView = m.get(position);
if (convertView != null) {
return convertView;
} else {
convertView = inflater.inflate(R.layout.topic_list, null);
TextView title = (TextView) convertView.findViewById(R.id.title);
m.put(position, convertView);
}
}
来自:http://www.eoeandroid.com/thread-56717-1-1.html
Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。
1,BaseAdapter:---数据来源于Arraylist-->MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:
Java代码
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" + MyArraylist.size());
return MyArraylist.size();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" + MyArraylist.size());
return MyArraylist.size();
}
getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.
Java代码
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
} else {
view = v;
}}
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
} else {
view = v;
}}
通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。
2,SimpleCursorAdapter:---数据来源于数据库--->MyCursor
要实现bindView()和newView()这两个抽象方法需要实现的内容。
public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。
public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。
通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。
注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。
对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。
注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常
Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。
1,BaseAdapter:---数据来源于Arraylist-->MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:
Java代码
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" + MyArraylist.size());
return MyArraylist.size();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" + MyArraylist.size());
return MyArraylist.size();
}
getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.
Java代码
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
} else {
view = v;
}}
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
} else {
view = v;
}}
通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。
2,SimpleCursorAdapter:---数据来源于数据库--->MyCursor
要实现bindView()和newView()这两个抽象方法需要实现的内容。
public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。
public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。
通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。
注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。
对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。
注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常
相关推荐
### Android之Adapter用法总结 #### 一、概念与作用 **Adapter** 是 Android 开发中连接后端数据和前端视图的一个关键组件。它作为数据和用户界面(UI)之间的桥梁,在Android开发中扮演着极其重要的角色。尤其是...
在Android开发中,ListView是一种常用的...自定义Adapter是Android开发中的核心技能之一,掌握好这一技巧,能帮助我们实现各种复杂的界面效果。通过不断实践和优化,我们可以在保证性能的同时,让用户体验更加出色。
总结起来,Adapter在Android开发中扮演着不可或缺的角色,它们是连接数据和UI的桥梁,使得开发者可以轻松地将各种类型的数据转换为用户友好的视图。理解并熟练掌握Adapter的使用,对于提升Android应用的用户体验至关...
总结来说,实现“Android ListView adapter不同布局”涉及自定义Adapter,重写关键方法,特别是`getView()`,并处理好数据源和布局的对应关系。在处理嵌套ListView时,需要考虑到性能优化,避免过度复杂的设计,以...
### Android开发Adapter详解 #### 一、Adapter概念与作用 在Android开发中,Adapter是一种用于连接数据源和视图组件...无论是对于初学者还是经验丰富的开发者来说,深入学习Adapter都是提升开发技能的关键步骤之一。
"Android 适配器用法总结" Android 中的 Adapter 是连接后端数据和前端显示的适配器接口,是数据和 UI(View)之间一个重要的纽带。在常见的 View(ListView,GridView)等地方都需要用到 Adapter。Adapter 的主要...
总结,Android的适配器机制是数据驱动界面的关键,而ViewPager则提供了流畅的页面滑动体验。理解并熟练掌握这两种组件的使用,对于开发高效的Android应用至关重要。通过实践和不断学习,初学者可以逐步提升在Android...
总结起来,"Android支持DataBinding的RecyclerView通用Adapter"是一个高效的解决方案,它整合了`DataBinding`的便利性和`BRVAH`的实用性,为开发者提供了一个强大且易用的工具,帮助他们更好地管理和展示列表数据。...
Adapter是Android开发中不可或缺的一部分,它是数据模型与用户界面之间的重要桥梁。在Android系统中,Adapter主要用于将数据源(如数组、列表或数据库查询结果)转换成可显示的视图组件,常见于ListView、GridView等...
总结起来,自定义Adapter在Android开发中扮演了至关重要的角色,它允许开发者根据需求定制ListView的每一个元素,提供更灵活的界面设计和交互体验。通过创建自定义Adapter并实现相关方法,我们可以实现更复杂的列表...
总结,通过结合ListView、Adapter和AsyncTask,我们可以实现在Android Studio中异步加载数据,提高应用的响应速度和用户体验。在实际开发中,还需要根据项目的具体需求,灵活运用这些技术和库,不断优化数据加载的...
总结起来,"android common adapter"是一种优化过的、适用于多种场景的Android适配器解决方案,结合`ViewHolder`模式,提高了列表滚动性能,并降低了适配器的编写复杂度。开发者可以基于`CommonAdapter`轻松实现自己...
总结起来,这个"android studio 自定义adapter开发闹钟小案例"涵盖了Android开发中的多个核心知识点:自定义Adapter的实现、ListView的使用、通知栏提醒的构建、以及数据持久化和定时任务的管理。通过这个案例,你...
这篇总结涵盖了Android界面设计、网络通信以及图形处理的一些核心概念。 首先,我们来讨论一下像素单位。在Android开发中,我们通常会遇到dip(设备独立像素)和dp(density-independent pixels),这两个单位都是...
总结一下,"最简洁的adapter"在xUtils框架中体现在BaseAdapter的使用上,它提供了方便的数据绑定和视图复用机制,极大地简化了开发过程。通过继承BaseAdapter并实现`getView()` 方法,开发者可以高效地将数据转化...
在这个"Android之Listview(item为单选题)自定义adapter Demo"中,我们将探讨如何利用ListView来实现一个类似于考试中单选题的选择界面。下面将详细介绍这个实现过程。 首先,我们需要创建一个自定义的Adapter,它...
总结起来,实现RecyclerView的“上拉加载更多”功能,主要是扩展Adapter,添加滚动监听和数据加载状态管理。这不仅提高了用户体验,还使得数据加载变得更为流畅。在实际开发中,可以根据项目需求进行调整,例如加入...