使用listview时候,需要书写以下几个地方:
1:新建一个l包含istview控件的layout
2:新建一个itemlayout(其中包含listview中item的格式:image+text)
3:新建一个Adapter extends BaseAdapter,这个adapter需要有构造函数(初始化mdata,LayoutInflater),并且重写getCount(),getItem(),getItemId()
,getView()这4个方法。
还可以新建内部类:ViewHolder(只需将item控件作为变量即可),优化listview的视图缓存模式。
4:在主类中实例化listview和adapter,使用mylistview.setAdapter(myadapter),绑定listview和adapter,实现数据显示。
以下我们使用我们的实例来实现各个步骤:
1:新建一个l包含istview控件的layout
- <ListView
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"></ListView>
2:新建一个itemlayout(其中包含listview中item的格式:image+text)
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
3:新建一个Adapter extends BaseAdapter,这个adapter需要有构造函数(初始化mdata,LayoutInflater),并且重写getCount(),getItem(),getView()三个方法。
还可以新建内部类:ViewHolder(只需将item控件作为变量即可),优化listview的视图缓存模式。(类代码来自《Android群英传》)
-
- public class MyAdspter extends BaseAdapter {
- private List<Map<String, Object>> data;
- private LayoutInflater layoutInflater;
- private Context context;
- public MyAdspter(Context context,List<Map<String, Object>> data){
- this.context=context;
- this.data=data;
- this.layoutInflater=LayoutInflater.from(context);
- }
- /**
- * 组件集合,对应list.xml中的控件
- * @author Administrator
- */
- public final class Zujian{
- public ImageView image;
- public TextView title;
- }
- @Override
- public int getCount() {
- return data.size();
- }
- /**
- * 获得某一位置的数据
- */
- @Override
- public Object getItem(int position) {
- return data.get(position);
- }
- /**
- * 获得唯一标识
- */
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder=null;
- if(convertView==null){
- holder=new ViewHolder ();
- //获得组件,实例化组件
- convertView=layoutInflater.inflate(R.layout.list, null);
- holder.image=(ImageView)convertView.findViewById(R.id.image);
- holder.title=(TextView)convertView.findViewById(R.id.title);
- convertView.setTag(holder);
- }else{
- holder=(ViewHolder)convertView.getTag();
- }
- //绑定数据
- holder.image.setBackgroundResource((Integer)data.get(position).get("image"));
- holder.title.setText((String)data.get(position).get("title"));
- return convertView;
- }
- public final class ViewHolder{
- public ImageView Img;
- public TextView title;
- }
- }
4:在主类中实例化listview和adapter,使用mylistview.setAdapter(myadapter),绑定listview和adapter,实现数据显示。
(这里需要注意的是:因为我们的listview的item是个复杂的数据类型,我们使用的是一个item对应一个map,map中保存了value为image或者title,key为对应的image和text的内容,所有的map组成一个List,并且listview中的adapter初始化为接受(Context,list),这里的list就是我们的显示内容)
- public class MainActivity extends Activity {
- private ListView listView=null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView=(ListView)findViewById(R.id.list);
- List<Map<String, Object>> list=getData();
- listView.setAdapter(new MyAdspter(this, list));
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- public List<Map<String, Object>> getData(){
- List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
- for (int i = 0; i < 10; i++) {
- Map<String, Object> map=new HashMap<String, Object>();
- map.put("image", R.drawable.ic_launcher);
- map.put("title", "这是一个标题"+i);
- list.add(map);
- }
- return list;
- }
- }
-
到此,我们的listview就算是做好了。