Android_listView_BaseAdapter
layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" ></ListView> </RelativeLayout>
layout_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
main.java
package com.example.day08_listview_baseadapter03_convertview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; /** * 1.滚动控件 1.ScrollView表示可以垂直方向滚动的控件 2.HorizontalScrollView表示的是水平方向滚动的控件 3. android:scrollbars="none"设置是否有滚动bar 4.滚动控件之间可以嵌套 *5.滚动控件只能有一个子控件 2.listview 列表控件 --适配器控件 1.能展示具有相同的数据类型,相似的ui显示的多组数据 2.适配器将数据转换成列表能够显示视图 3.数据源可以是entrys,数组,集合 3.适配器填充数据 1.arrayadapter 1.只能填充文本内容 2.只能填充一个文本 2.simpleadapter 1.可以自定义item布局,里面可以包含图片,文本,button,checkbox等.. 2.可以设置多样的数据 3.设置数据不方便 4.自定义适配器去完成复杂样式的布局view --- baseadapter 1.baseadapter是抽象类,需要继承 2.实现未实现的方法 3.设置适配器 * @author my * */ public class MainActivity extends Activity { private ListView lv; private List<Map<String,Object>> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.listView); list = new ArrayList<Map<String,Object>>(); int[] image = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher}; Map<String,Object>map ; for (int i = 0; i < image.length; i++) { map = new HashMap<String, Object>(); map.put("name", "杭州"+i); map.put("image", image[i]); list.add(map); } MyAdapter myAdapter = new MyAdapter(); lv.setAdapter(myAdapter); } class MyAdapter extends BaseAdapter{ /** * 必须实现,决定适配器空间的item的数量 * 通常返回数据源的长度,当返回0时,没有显示 */ @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } /** * position表示的是item对应的索引 * 通常根据索引来获得对应的数据,并返回 * 不是必须实现 * */ @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } /** * position表示的是item对应的索引 * 通常返回position作为item的id * 不是必须实现 */ @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } /** * 用来确定一个item展示的视图view * 返回的view就表示需要显示的一个item的view * position表示的是当前显示的item的view所对应的索引 * convertView 可以复用的view * parent 表示的是设置该适配器的适配器控件(listView) */ //布局的复用 /** * 问题: getview在滑动的过程中,会重复多次执行 1.会多次将布局文件转换成view(需要读取xml文件和解析),而这个方法是耗时,消耗资源的方法 2.会多次遍历view去找控件,会消耗时间和资源 解决:convertView表示的是可以复用view */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = convertView; ViewHolder viewHolder ; //第一次调用 if(view==null){ //加载布局 view = View.inflate(MainActivity.this, R.layout.layout_item, null); viewHolder = new ViewHolder(); //实例化控件(因为是在当前布局中查找控件,所以必须使用view调用findViewById()) viewHolder.text = (TextView) view.findViewById(R.id.text); viewHolder.image = (ImageView)view.findViewById(R.id.image); //设置标记 view.setTag(viewHolder); }else{ //得到标记获得viewHolder对象 viewHolder = (ViewHolder) view.getTag(); } //获得该索引位置的map集合 Map<String,Object>map = list.get(position); //为适配器控件的每一条view设置数据 viewHolder.text.setText((String)map.get("name")); viewHolder.image.setImageResource((Integer)map.get("image")); return view; } } //自定义类(一般都使用ViewHolder类来存view控件) class ViewHolder{ private TextView text; private ImageView image; } }