zoukankan      html  css  js  c++  java
  • 详解ListView分页(带图片)显示用法案例

     

    名人名言:时间伟大的作者,她能写出未来的结局——MRMY 

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

  • 相关阅读:
    web框架-(七)Django补充---models进阶操作及modelform操作
    web框架-(六)Django补充---form表单验证
    web框架-(五)Ajax
    时间处理总结(一).net
    linq 多条件查询 where 拼接+分页
    Angularjs总结(八)$ cookie和$rootscope
    Angularjs总结(七) 路由及请求服务等
    Nhibernate总结(一)查询返回指定字段
    asp.net mvc5 设置Area下的为启动页
    Angularjs总结(五)指令运用及常用控件的赋值操作
  • 原文地址:https://www.cnblogs.com/appzhang/p/2678453.html
Copyright © 2011-2022 走看看