zoukankan      html  css  js  c++  java
  • Android------------------ListVIew学习

    一、ListActivity :  如何你的Activity仅涉及到一个列表(ListVIew),那么你就该考虑使用ListActivity这个类

      注意事项:1.ListActivity 里面默认包含显示的ListView视图

           2.想自定义布局且显示出来,必须把ID设置为 android:id = “@id/list”

                 否则系统会报出这样的错误: Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

    public class TextActivity extends ListActivity {
    private String[] objs = {"北京", "上海", "天津"};
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(TextActivity.this,
    R.layout.listview1, R.id.line3, objs);
    setListAdapter(adapter);
    }
    }

    activity_main.xml文件内容显示
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
    android:id="@+id/line1" ---------------->致命的错误,它的ID必须为list才能编译过
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    </ListView>
    </LinearLayout>

    二、ListView的点击事件  1.onItemClickListener : 当有一个item被点击触发的时候,它的回调函数是onItemClick()
      2.在ListActivity中使用item点击事件时候,需要重写onItemListener()这个函数
      3.读取xml文件中的数据方式:  
        couse.xml文件
        <resources>
        <string-array name="course">
      <item> 嵌入式</item>
      <item> C语言</item>
      <item> Java</item>
      <item> Android</item>
        </string-array>
        </resources>

       private String [] objs;
       objs = MainActivity.this.getResources().getStringArray(R.array.course);

      4.SimpleAdapter的创建数据源的方法   

        List<Map<String , Object> >dataSource1= new ArrayList<Map<String ,Object>>();   //这个比较使用起来好一些

       List<Map<String , String>> dataSource1= new ArrayList<Map<String, String>>();

        Map<String , Object> map = new HashMap<String , Object>();    //这个比较使用起来好一些

        Map<String, String> map = new HashMap<String, String>();       //new出数据源的对象 

               map.put("name" , "小明");

          map.put("age" , "23");

          dataSource1.add(map);           //new ArrayList<Map<String, String>>();

                                          //不执行会报出on a null object reference 会爆出空引用的错误

       5.adpater.notifyDataSetChangge()  :  可以重新调用listView.setAdapetr来刷新数据 , 更新数据一定要有mlist.add()的方法才可以刷新数据

      三、继承BaseAdapter的重写的方法

        1.getCount :  得到数据的个数

        2.getItem  :  得到项目

        3.getItemID : 的到项目的ID

        4.getView   : 得到视图View

      四、ListView的优化性能

        1.不使用listView.addView来添加视图,这个机制是由adapter来实现的

          (1).优化view的方法

          view重复利用的话,可以减少创建view的次数,从而来减少cpu的消耗

           

      public View getView(int position, View convertView, ViewGroup parent) {
       View view = convertView;
        //防止解析布局多次重复解析来浪费cpu
      if(convertView == null)
       view = getLayoutInflater().inflate(R.layout.listexercise, parent, false);
        
      (2).优化控件
        减少多次查找findViewById次数来达到优化:       

        

        //创建持有者HoldView的方法

         

        

      
    public   View getView(int position, View convertView, ViewGroup parent)
        {
              ViewHolder viewHolder = null;
              if (null == convertView)
              {
                  viewHolder = new ViewHolder();
                  LayoutInflater mInflater = LayoutInflater.from(mContext);
                  convertView = mInflater.inflate(R.layout.item_marker_item, null);
    
                  viewHolder.name = (TextView) convertView.findViewById(R.id.name);
                  viewHolder.description = (TextView) convertView
                        .findViewById(R.id.description);
                  viewHolder.createTime = (TextView) convertView
                        .findViewById(R.id.createTime);
    
                  convertView.setTag(viewHolder);          //setTag还需要深入学习
              }
              else
              {
                  viewHolder = (ViewHolder) convertView.getTag();
              }
         private static class ViewHolder
          {
              TextView name;
              TextView description;
              TextView createTime;
          }

    五、关于view的setTag有一个坑来注意一下

    converView.setTag("pic",picHolder);

    converView.getTag("pic");

    项目会Crash,开始抛出IllegalArgumentException的问题了

    解决办法:

    那么我们要怎么实现唯一的key呢?其实我们可以把key定义在资源文件中,再由编译器生成对应的,唯一的id!因此我们可以这样写在项目的资源res/values/string.xml中:

    converView.setTag(R.id.tag_text,picHolder);

    converView.getTag(R.id.tag_text);

    
    





    
    
    

        

     


      

  • 相关阅读:
    C++ 虚函数表解析
    C#编写简单的聊天程序
    c#事件与委托
    c#文本控件实现换行
    docker 详细安装及问题排查
    hadoop命令行
    Spark中的多线程并发处理
    CDH6.1.0离线安装——笔记
    linux 常用命令
    Rsync 恢复 libselinux.SO.1
  • 原文地址:https://www.cnblogs.com/liunx1109/p/9853697.html
Copyright © 2011-2022 走看看