使用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就算是做好了。