BaseAdapter方法
getCount : 要绑定的条目的数目,比如格子的数量
getItem : 根据一个索引(位置)获得该位置的对象
getItemId : 获取条目的id
getView : 获取该条目要显示的界面
public class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View
convertView, ViewGroup parent) {
return null;
}
}
首先在MyBaseAdapter中添加super()方法,用来将数据源
传入MyBaseAdapter中。其中this.data = data;的意思是
将传入的形参赋值给我们的私有变量以供使用。mContext
是在后面要调用到
private String[] data;
private Context mContext;
public MyBaseAdapter(Context mContext, String[]
data) {
super();
this.mContext = mContext;
this.data = data;
}
然后就可以将getCount的返回值修改为我们的数据源的长
度,要显示几个条目,我们就传入多长的数据源就可以
public int getCount() {
return data.length;
}
接着将getView的方法改为显示出我们数据源的字符串
public View getView(int position, View
convertView, ViewGroup parent) {
TextView textView = new TextView(mContext);
textView.setText(data[position]);
return textView;
}
这里为每一个条目新建一个TextView用来显示字符串,新
建的时候就需要传入一个Context,就用到了我们之前的
mContext。
这样我们就可以使用MyBaseAdapter来显示一
个字符串数组了。不过还需要在前面修改一下,在新建
mBaseAdapter的时候要传入context和数据源
String[] strings = {“a”,“b”,“c”};
MyBaseAdapter mBaseAdapter = new MyBaseAdapter
(getApplicationContext(),strings);
代码:
MainActivity部分
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends
AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
String[] strings = {"a","b","c"};
MyBaseAdapter mBaseAdapter = new
MyBaseAdapter(getApplicationContext(),strings);
listView.setAdapter(mBaseAdapter);
}
}
MyBaseAdapter部分
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyBaseAdapter extends BaseAdapter {
private String[] data;
private Context mContext;
public MyBaseAdapter(Context mContext,
String[] data) {
super();
this.mContext = mContext;
this.data = data;
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View
convertView, ViewGroup parent) {
TextView textView = new TextView
(mContext);
textView.setText(data[position]);
return textView;
}
}
BaseAdapter进阶使用
首先新建一个layout,我命名为item,这个就是我们每个
条目要展示的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android="http://schemas.android.com/apk/res/
android"
xmlns:app="http://schemas.android.com/apk/res-
auto"
android:orientation="horizontal"
android:layout_width=“match_parent”
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher"
android:id="@+id/imageView" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button" />
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView" />
接下来修改getView方法,让它显示我们这个item布局
public View getView(int position, View
convertView, ViewGroup parent) {
LayoutInflater inflater =
LayoutInflater.from(mContext);
View view = inflater.inflate
(R.layout.item,null);
final TextView textView = (TextView)
view.findViewById(R.id.textView);
Button button = (Button) view.findViewById
(R.id.button);
ImageView imageView = (ImageView)
view.findViewById(R.id.imageView);
imageView.setImageResource
(R.mipmap.ic_launcher);
button.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
textView.append("!");
}
});
textView.setText(data[position]);
return view;
}
LayoutInflater是用来加载布局的,用LayoutInflater的
inflate方法就可以将你的item布局绘制出来。其中
getView方法中的三个参数,position是指现在是第几个
条目;convertView是旧视图,就是绘制好了的视图;
parent是父级视图,也就是ListView之类的。
用inflate
方法绘制好后的view最后return返回给getView方法
BaseAdapter的优化使用
convertView是旧视图就是listview如果超出了屏幕,滑
动的时候会隐藏掉一部分,这时候就将隐藏掉的部分保存
到convertView中
首先定义一个类ViewHolder,用来标记我们的控件
static class ViewHolder{
TextView textView;
ImageView imageView;
Button button;
}
使用ViewHolder优化
public View getView(int position, View
convertView, ViewGroup parent) {
LayoutInflater inflater =
LayoutInflater.from(mContext);
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate
(R.layout.item, null);
holder = new ViewHolder();
holder.button = (Button)
convertView.findViewById(R.id.button);
holder.textView = (TextView)
convertView.findViewById(R.id.textView);
holder.imageView = (ImageView)
convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder)
convertView.getTag();
}
holder.imageView.setImageResource
(R.mipmap.ic_launcher);
holder.button.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(“click”,“button”);
}
});
holder.textView.setText(data[position]);
return convertView;
}
先判断convertView是否为空,是的话就创建ViewHolder
,不是的话就取出ViewHolder,这样就可以实现复用
convertView了。