MyException - 我的异常网
当前位置:我的异常网» 移动开发 » ListView分页(带图片)展示用法案例

ListView分页(带图片)展示用法案例

www.MyException.Cn  网友分享于:2013-07-04  浏览:28次
ListView分页(带图片)显示用法案例
ListView是Android中最为常用的列表类型控件,ListView中的选择项目中样式很多有的是纯文字的、有的还可以带有图片。它的继承关系如下:
java.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.widget.AdapterView<T extends android.widget.Adapter>
         ↳ android.widget.AbsListView
           ↳ android.widget.ListView
android.widget.ListView继承了android.view.ViewGroup。
首先看一个纯文本的ListView例子,案例运行后会出现一个城市列表如图6-8所示,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。
 


图6-8 ListView
程序代码请参考代码清单6-4:
【代码清单6-4】 chapter6_3/src/com/work/ListView_1_Activity.java
public class ListView_1_Activity extends Activity {
	private ListView listview;
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_activity);
        
        listview = (ListView)findViewById(R.id.ListView01);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mStrings);
        listview.setAdapter(adapter);
		   listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        	@Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1_Activity.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
    		}
    	});
    }

    private String[] mStrings = {
            "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};
}

对于ArrayAdapter应该已经很熟悉了,其中的android.R.layout.simple_list_item_1是使用系统的布局样式。Android系统本身提供了很多的这样的布局文件,但是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是使用时需要注意的。
在这种方式下,需要在布局文件listview_activity.xml中添加ListView控件:
<ListView android:id="@+id/ListView01" android:layout_width="wrap_content"
android:layout_height="wrap_content"></ListView>
由于ListView在Android中是很常用的列表类型控件,只要是有多条信息需要显示的时候都可以考虑使用ListView展示出来,正是由于ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。
通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。同样上面案例如果使用ListActivity请参考代码清单6-5的写法:
【代码清单6-5】 chapter6_3/src/com/work/ListView_1.java
public class ListView_1 extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mStrings));
        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        	@Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
    		}
    	});
    }

    private String[] mStrings = {
            "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};
} 

查看代码不难发现这里没有使用布局文件,那就意味着不需要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代码如下:
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override
    		public void onItemClick(AdapterView<?> parent, View v, int pos,
    				long id) {
        		Toast.makeText(ListView_1.this, mStrings[pos],
						Toast.LENGTH_SHORT).show();
	}
});}

另外一种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码如下所示。
@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT)
				.show();


再看一个自定义Adapter的例子,这是一个带有图标的ListView,程序运行结果如图6-9所示。
 


图6-9 自定义adapter
相关程序代码请参考代码清单6-6:
【代码清单6-6】 chapter6_3/src/com/work/ListViewIcon_3.java
public class ListViewIcon_3 extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new EfficientAdapter(this));
    }

    private static final String[] DATA = {
    	 "北京市", "天津市", "上海", "重庆", "哈尔滨",
         "石家庄", "秦皇岛", "济南", "青岛", "南京", 
         "三亚", "昆明", "成都", "长沙", "武汉",
         "九江", "香港", "澳门","兰州","张家口" };
… 
}

自定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请参考代码清单6-7:
【代码清单6-7】 chapter6_3/src/com/work/ListViewIcon_3.java
private static class EfficientAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Bitmap mIcon0;
        private Bitmap mIcon1;
…  … 
        public EfficientAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
            mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon);
            mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing);
…   … 
      }

        public int getCount() {
            return DATA.length;
        }

        public Object getItem(int position) {
            return DATA[position];
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.main, null);

                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.textview);
                holder.icon = (ImageView) convertView.findViewById(R.id.icon);

                convertView.setTag(holder);
            } else { 
                holder = (ViewHolder) convertView.getTag();
            }

            holder.text.setText(DATA[position]);
            switch(position)
            {
            case 0:
            	holder.icon.setImageBitmap(mIcon1);
            	break;
            case 1:
            	holder.icon.setImageBitmap(mIcon2);
            	break;
          … 
            default:
            	holder.icon.setImageBitmap(mIcon0);
            	break;
            }
            

            return convertView;
        }

        static class ViewHolder {
            TextView text;
            ImageView icon;
        }
    }

编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法:
• int getCount() 返回总数据源中总的记录数;
• Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据;
• long getItemId(int position) 根据选择的项目的位置;
• View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。
这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。
if (convertView == null) {
				convertView = mInflater.inflate(R.layout.main, null);

				holder = new ViewHolder();
				holder.text = (TextView) convertView
						.findViewById(R.id.textview);
				holder.icon = (ImageView) convertView.findViewById(R.id.icon);

				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
}

只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。
而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。
ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。
                                                       出自《Android开发案例驱动教程》第六章

文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
我是如何打败拖延症的
我是如何打败拖延症的
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
如何成为一名黑客
如何成为一名黑客
那些争议最大的编程观点
那些争议最大的编程观点
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员应该关注的一些事儿
程序员应该关注的一些事儿
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
 程序员的样子
程序员的样子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
旅行,写作,编程
旅行,写作,编程
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员都该阅读的书
程序员都该阅读的书
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Java程序员必看电影
Java程序员必看电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
鲜为人知的编程真相
鲜为人知的编程真相
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
中美印日四国程序员比较
中美印日四国程序员比较
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我的丈夫是个程序员
我的丈夫是个程序员
漫画:程序员的工作
漫画:程序员的工作
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有