Export to GitHub

androidlearn - Adapter_custom.wiki


重写Adapter类需要实现的方法

需要重写Adapter类的四个方法即可,分别是 public int getCount(); public Object getItem(int position); public long getItemId(int position); public View getView(int position, View convertView, ViewGroup parent); 调用时仍然是在ListView或ListActivity中直接setAdapter(CustomAdapter);即可

重写Adapter类

cover.xml的layout文件

``` android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">



```

实现一个继承于Activity的类,在类中的onCreate()方法中把布局给画出来

``` public class Cover extends Activity {

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    //上面的布局
    setContentView(R.layout.cover);  
    ListView lv = (ListView) findViewById(R.id.summary);  
    //自定义Adapter
    FooAdapter adapter = new FooAdapter(this);  
    lv.setAdapter(adapter);  
}  

}
```

继承于BaseAdapter

简单的显示只有一个TextView

``` /用的数据源是个很简单的String,同时在类中还加上了一个Context类型的变量_ctx,此变量将在构造时被赋值。放个简单的TextView,这里对getView做修改就可以了。/

class FooAdapter extends BaseAdapter {
private Context _ctx = null;
//数据源 private String[] _data = { "foo", "bar", "foobar", "barfoo" };
public FooAdapter(Context context) {
_ctx = context;
}
@Override
public int getCount() {
return _data.length;
}
@Override
public Object getItem(int position) {
return _data[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建个TextView存放数据 TextView tv = null;
if (null == convertView) {
tv = new TextView(_ctx);
Log.v("huzim", "Pos1 is " + position);
} else {
tv = (TextView) convertView;
}
tv.setText(_data[position]);
return tv;
}
}
```

每次调用getView会返回一个LinearLayout,里面包含有两个TextView

``` //convertView为Adapter中每个数据显示的控件 @Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout lay = null;

 TextView tv_l = new TextView(_ctx);  
 TextView tv_r = new TextView(_ctx);  
 tv_l.setText("* ");  
 tv_r.setText(_data[position]);  
 tv_r.setGravity(Gravity.RIGHT);  
 if (null == convertView) {  
     lay = new LinearLayout(_ctx);  
     lay.addView(tv_l);  
     lay.addView(tv_r);  
 } else {  
     lay = (LinearLayout) convertView;  
 }  
 return lay;  

}
```

每次返回一个TableLayout,暂时里面只有两列。

用TableLayout是因为有些列可能需要右对齐,好像在TextView里面做不了。 有一点需要注意的就是,在TableLayout中如果要设置右对齐的话, 一定需要给对应列设置ColumnStretchable属性,要不然内容不会展开。 ``` @Override
public View getView(int position, View convertView, ViewGroup parent) {
TableLayout lay = null;

 TableRow tr = new TableRow(_ctx);  
 TextView tv_l = new TextView(_ctx);  
 TextView tv_r = new TextView(_ctx);  
 tv_l.setText("* ");  
 tv_r.setText(_data[position]);  
 //右对齐
 tv_r.setGravity(Gravity.RIGHT);  
 tv_r.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
 tr.addView(tv_l);  
 tr.addView(tv_r, new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
 if (null == convertView) {  
     lay = new TableLayout(_ctx);  
     lay.addView(tr);  
 } else {  
     lay = (TableLayout) convertView;  
 }  
 /*在TableLayout中如果要设置右对齐的话,一定需要给对应列设置ColumnStretchable属性,要不然内容不会展开*/
 lay.setColumnStretchable(1, true);  
 return lay;  

}
```