`

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开发案例驱动教程》第六章
  • 大小: 15.6 KB
  • 大小: 26.3 KB
分享到:
评论

相关推荐

    主题:ListView分页(带图片)显示用法案例

    主题:ListView分页(带图片)显示用法案例,主题:ListView分页(带图片)显示用法案例

    android listview 分页显示 demo

    总之,这个demo提供了一个实用的案例,教你如何在Android应用中实现高效且流畅的ListView分页加载,并通过内存缓存优化图片加载性能。通过深入研究这个项目,开发者可以提升自己在处理大数据量列表和图片加载方面的...

    Android源码——ListView分页功能源码.zip

    在Android中实现ListView分页,通常有以下几种方法: 1. **使用Adapter和Pagination**: - 你需要创建一个自定义的Adapter来处理数据,当ListView滚动到底部时,触发加载更多数据的事件。 - 通过监听ListView的...

    Listview分页经典版

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。ListView的分页加载机制...`MyListViewFenYe`项目提供了一个实践案例,开发者可以参考其代码结构和逻辑,进一步理解和掌握ListView分页的实现。

    android ListView滑动分页加载和点击分页加载,以及复用convertView综合案例

    在实现ListView分页加载时,我们需要注意以下几点: 1. **优化网络请求**:合理设置每页数据量,避免一次性加载过多导致内存压力。同时,可以使用缓存策略,减少不必要的网络请求。 2. **避免过度绘制**:通过设置...

    andriod的listview分页动态加载网络数据源码

    在这个场景中,"andriod的listview分页动态加载网络数据源码"是指如何使用ListView实现从网络上动态加载并分页显示新闻列表。这个过程涉及到多个关键知识点,包括ListView的工作原理、网络请求、数据解析以及分页...

    应用源码之Listview分页加载数据.zip

    "应用源码之Listview分页加载数据.zip"这个压缩包文件很显然是为了帮助开发者理解如何在ListView中实现分页加载数据这一核心功能。这里我们将深入探讨相关知识点。 1. **ListView的基本使用**: ListView是Android...

    Android ListView分页功能源码-IT计算机-毕业设计.zip

    总之,“Android ListView分页功能源码”这个项目涵盖了Android应用开发中的许多重要知识点,包括ListView的使用、自定义Adapter、事件监听、网络请求、数据刷新以及性能优化。对于初学者来说,这是一个很好的实践...

    Android Listview分页加载数据-IT计算机-毕业设计.zip

    这个"Android Listview分页加载数据"的项目,很显然是一个针对Android应用的毕业设计示例,它着重讲解了如何在ListView中实现数据的分页加载。对于初学者或者进行毕业设计的学生来说,这是一个非常实用的案例,能够...

    Android应用源码之Listview分页加载数据-IT计算机-毕业设计.zip

    本项目"Android应用源码之Listview分页加载数据"是一个典型的移动开发App毕业设计案例,它旨在教授如何在Android应用中实现ListView的分页加载功能,提高用户体验并优化性能。以下是关于这个项目的一些关键知识点: ...

    视频案例-3.ListView动态添加数据

    在本视频案例“视频案例-3.ListView动态添加数据”中,我们将深入探讨如何在Android开发环境中,使用ListView组件动态地加载和展示数据。ListView是Android UI设计中的一个重要组成部分,它用于展示大量的数据列表,...

    android listview 实例demo

    除了基本的文本显示,我们还可以通过自定义View和使用样式来实现更复杂的布局和交互效果,比如图片、按钮等。 9. **加载进度条**: 当数据量大时,我们可以添加Footer View来显示加载进度,或者使用下拉刷新和上...

    Android自制带刷新的ListView

    总之,"Android自制带刷新的ListView"是一个关于如何在不依赖第三方库的情况下,利用自定义组件和事件监听来实现列表刷新和加载更多功能的实践案例。这不仅锻炼了开发者对Android组件的理解,也提升了他们解决实际...

    ListView_demo.rar

    demo.rar中的示例代码可能包含了如何集成SwipeRefreshLayout或PullToRefreshLibrary实现上拉刷新,使用Adapter和OnScrollListener结合异步加载数据实现下拉加载更多,以及如何处理数据分页和更新ListView内容的逻辑...

    横向listview显示蒙文

    在Android开发中,ListView通常用于显示垂直列表,但有时我们可能需要实现横向展示的效果,比如在本案例中,目标是创建一个横向的ListView来显示蒙古文。为了实现这个功能,我们需要借助一些特殊的布局和适配器技巧...

    Android 中ListView的应用

    ListView的分页加载(下拉刷新和上拉加载更多)是另一个重要话题。通过监听ListView的滚动事件,我们可以判断用户是否接近列表底部,然后动态加载更多数据。Android提供了`SwipeRefreshLayout`组件,可以实现下拉...

    c# 无刷新分页案例

    综上所述,"C#无刷新分页案例"涉及到的技术点包括ASP.NET控件的分页功能、Ajax技术、jQuery和JavaScript的交互、C#后端处理分页请求的方法、数据库的高效查询以及前端的用户体验优化。通过理解和应用这些知识点,...

    C#超级好用的分页控件

    本案例中的C#分页控件因其易用性和兼容性而备受推崇,对于开发者来说,研究和使用这样的控件可以帮助提升项目的质量和效率。如果你正在寻找一个可靠的分页解决方案,这个“C#超级好用的分页控件”无疑是值得考虑的...

    android瀑布流listview

    在本案例中,我们讨论的是如何在Android中实现瀑布流ListView,并且它已经集成了上拉刷新和下拉分页功能,以提供更流畅的滚动体验。 1. **瀑布流ListView实现原理** 瀑布流布局的核心在于计算每行的高度和调整元素...

    TestTab1.zip_ListView_listview android

    1. **ListView的基本使用**:ListView的基础用法包括设置适配器(Adapter),定义每个列表项的布局(Item Layout)以及在getView()方法中填充数据。适配器是连接数据源和ListView的关键,常见的有ArrayAdapter、...

Global site tag (gtag.js) - Google Analytics