扩展BaseAdapter实现不存储列表项的ListView
下面的实例将会通过扩展BaseAdapter来实现Adapter,扩展BaseAdapter可以取得对Adapter最大的控制权;程序要创建多个列表项,每个列表项的组件都由开发者来决定。
下面的布局文件非常简单,布局文件只包含一个简单的ListView,布局文件代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/myList" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
该实例的Activity将会扩展BaseAdapter来实现Adapter对象,Activity代码如下:
程序清单文件:
package org.crazyit.helloworld; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.*; public class BaseAdapterTest extends Activity { ListView myList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_adapter_test); myList=(ListView)findViewById(R.id.myList); BaseAdapter adapter=new BaseAdapter() { @Override public int getCount() { // TODO Auto-generated method stub //指定一共包含40个选项 return 40; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } //重写该方法,该方法的返回值将作为列表项的ID @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } //重写该方法,该方法返回的View将作为列表框 @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //创建一个LinearLayout,并向其中添加两个组件 LinearLayout line=new LinearLayout(BaseAdapterTest.this); line.setOrientation(0); ImageView image=new ImageView(BaseAdapterTest.this); image.setImageResource(R.drawable.ic_launcher); TextView text=new TextView(BaseAdapterTest.this); text.setText("第"+(position+1)+"个列表项"); text.setTextSize(20); text.setTextColor(Color.RED); line.addView(image); line.addView(text); return line; } }; myList.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.base_adapter_test, menu); return true; } }
上面程序中的关键在于粗体字代码,粗体字代码创建了一个BaseAdapter对象,扩展该对象需要重写如下4个方法。
- getCount():该方法的返回值控制该Adapter将会包含多少列表项目。
- getItem(int position):该方法的返回值决定第position处的列表项的内容。
- getItemId(int position):该方法的返回值决定第position处的列表项的ID。
- getView(int positon,View convertView,ViewGroup parent):该方法的返回值决定第position处的列表项的组件。
上面4个方法中最重要的是第1个与第4个。
表面上看此处只是在介绍ListView,但是实际上这里的知识完全适用于AdapterView的其他子类:GridView、Spinner、Gallery、AdapterViewFlipper等。
运行上面的Activity程序将会出现如下效果: