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开发案例驱动教程》第六章

时间: 2024-09-20 00:25:56

ListView分页(带图片)显示用法案例的相关文章

java读取服务器html文件带图片显示到前端

问题描述 java读取服务器html文件带图片显示到前端 html文件是通过word另存为生成的,存放位置不在web项目路径下,我现在通过文件流的方式读取html文件显示到浏览器,但图片无法显示出来,怎样解决呢? 解决方案 因为HTML文件也是文本文件,所以使用简单的字符流读取就可以了,而图片是二进制文件,需要字节流读取,可以使用ImageIO类(详细用法参照API文档)读取并写出图片,然后使用HTML的标签显示即可.当然这仅仅是解决思路之一.

PHP图片上传类带图片显示_php基础

这是一个PHP的文件上传类带图片显示的.其实做成函数就可以了.不过还是做成类好玩一点.~~~~ 本来应该用JS来验证上传文件类型的.但懒得做了. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3

一款简单PHP图片上传类带图片显示代码

uploadimg.class.php文件  代码如下 复制代码 class upload { var $upload_name; var $upload_tmp_address; var $upload_server_name; var $upload_filetype ; var $file_type; var $file_server_address; var $image_w=900; //要显示图片的宽 var $image_h=350; //要显示图片的高 var $upload_f

Android ListView滑动过程中图片显示重复错乱闪烁的原因及解决方法

主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的ite

Android ListView滑动过程中图片显示重复错位闪烁问题解决

主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,

使用freemarker生成word带图片,图片显示不正常

问题描述 使用freemarker生成word带图片,图片显示不正常 使用freemarker导出word带图片,本地测试可以,放到服务器上就会出现有的图片显示不正常,是有的图片,是什么原因啊,求指点,图片是base64处理 解决方案 图片损坏了,检查下是传输不完整还是有异常发生 解决方案二: 应该是网络的问题 没有完整的上传 解决方案三: 应该是网络的问题 没有完整的上传

scollview内嵌套listview加载图片时显示在了listview上。

问题描述 scollview内嵌套listview加载图片时显示在了listview上. 我的scollview里面有imageview.和listview,listview加载图片完成 之后只显示listview,而imageview被翻到了上面,需要手动滑下来才看得见. 请教各位大神帮我解决下. 解决方案 加载完后,延时滚动到顶部. scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView

listview嵌套gridview,gridview显示图片,图片显示不完全

问题描述 listview嵌套gridview,gridview显示图片,图片显示不完全 listview 的header包含一个gridview ,gridview想显示大图宽度是 match_parent,高度如果是固定高度图片能显示完全,如果是wrap_content为什么图片不能完全加载出来,已经自定义gridview public class GridViewForListView extends GridView { public GridViewForListView(Contex

怎么样在网站图片带参数显示不同尺寸、不同大小的图?

问题描述 怎么样在网站图片带参数显示不同尺寸.不同大小的图? 如题,例如:http://posts.cdn.wallstcn.com/87/75/ae/05korea-cnd-articlelarge.png!index-top1-coverhttp://posts.cdn.wallstcn.com/87/75/ae/05korea-cnd-articlelarge.png 同样的URL地址,带上参数后,显示不同尺寸.不同大小的图片 解决方案 尺寸不同的图片?是不同的图片? 还是相同的一张图,用