• 安卓ListView的使用


    1.简单介绍ListView

          listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。

          getView方法详情

       View getView (int position, View convertView, ViewGroup parent)
    Get a View that displays the data at the specified position in the data set.
    You can either create a View manually or inflate it from an XML layout file.
    When the View is inflated, the parent View (GridView, ListView...) will apply
    default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to
    specify a root view and to prevent attachment to the root
    备注:使用适配器构建布局

    如果布局的内容是属于动态或未预先确定的内容,您可以使用这样一种布局:在运行时通过子类 AdapterView 用视图填充布局。 AdapterView 类的子类使用 Adapter 将数据与其布局绑定。

    Adapter 充当数据源与 AdapterView 布局之间的中间人—Adapter(从数组或数据库查询等来源)检索数据,并将每个条目转换为可以添加到 AdapterView 布局中的视图。

              适配器支持的常见布局包括:

               

        使用数据填充适配器视图       

        您可以通过将 AdapterView 实例与 Adapter 绑定来填充 AdapterView(如 ListView 或 GridView),此操作会从外部来源检索数据,并创建表示每个数据条目的 View

    Android 提供了几个 Adapter 子类,用于检索不同种类的数据和构建 AdapterView 的视图。 两种最常见的适配器是:ArrayAdapterSimpleCursorAdapter。

                 

    2.ListView使用步骤

         1).在布局的XML文件中,添加如下代码:

               

    <ListView
          android:id="@+id/list_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

       

         2)新建list_item的布局文件,确定每一个View的样式。

                    

      3).新建一个适配器类。

         4).绑定数据到视图。

    3.使用实例

         1).使用ArrayAdapter

               主layout文件:

    mylistview.xml文件
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <ListView 
            android:id="@+id/mylistview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
        </ListView>
    </LinearLayout>

              list_item的xml文件:

    list_item.xml文件
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="18sp"
          >
    </TextView>

             activity文件:

            

    MyActivity.java文件
    
    
    public class MyActivity extends Activity{
    
        private ListView listview;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mylistview);
          listview = (ListView)findViewById(R.id.mylistview);
          String[] str = {"上海","北京","天津","江苏","河南","西藏","新疆","湖南","湖北"};
          List<String> listdata = new ArrayList<String>();
          listdata.add("上海");
          listdata.add("北京");
          listdata.add("天津");
          listdata.add("江苏");
          ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item,listdata);//listdata和str均可
          listview.setAdapter(arrayAdapter);
        }
        
        
    }

           2.使用SimpleAdapter

             构造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

             simpleAdapter可以通过hashmap的方式,每个view可以显示几种不同的内容。

            1).主layout文件和上面相同

            2).list_item的布局文件

                 

    <?xml version="1.0" encoding="UTF-8"?>
    <RelativeLayout 
           xmlns:android="http://schemas.android.com/apk/res/android" 
           android:layout_width="match_parent"
            android:layout_height="match_parent"
        >
     <ImageView 
         android:id="@+id/iv1"
         android:layout_width="30dp"
         android:layout_height="30dp"
         android:src="@drawable/ic_launcher"    
         />
    <TextView 
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="wgj"
            android:layout_toRightOf="@id/iv1"
          >
    </TextView>
    <TextView
         android:id="@+id/tv2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="18sp"
         android:text="19岁"
         android:layout_below="@id/tv1"
         android:layout_toRightOf="@id/iv1"
        >
    </TextView>
    </RelativeLayout>

          3.activity文件

             

    public class MyActivity extends Activity{
    
        private ListView listview;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mylistview);
          listview = (ListView)findViewById(R.id.mylistview);
          SimpleAdapter simpleAdapter = new SimpleAdapter(this,putData(),R.layout.list_item,
                  new String[]{"name","age","pic"},new int[]{R.id.tv1,R.id.tv2,R.id.iv1});
          listview.setAdapter(simpleAdapter);
        }
        
        public List<Map<String,Object>> putData(){
            
            List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
            Map<String,Object> map1 = new HashMap<String,Object>();
            map1.put("name", "张三");
            map1.put("age", "19岁");
            map1.put("pic", R.drawable.friend);
            Map<String,Object> map2 = new HashMap<String,Object>();
            map2.put("name", "李四");
            map2.put("age", "17岁");
            map2.put("pic", R.drawable.ic_launcher);
            Map<String,Object> map3 = new HashMap<String,Object>();
            map3.put("name", "王五");
            map3.put("age", "17岁");
            map3.put("pic", R.drawable.ic_launcher);
            list.add(map1);
            list.add(map2);
            list.add(map3);
            return list;
        }  
    }

       3.使用BaseAdapter

            优化方法 convertView 重用对象

              3.1.通过缓存convertView实现 
                  - 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

              3.2.通过convertView+ViewHolder来实现 
                    -ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。 
                    -代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

             

             3.3Adapter文件

    public class MyAdapter extends BaseAdapter{
    
        private LayoutInflater mInflater;
        private List<Map<String,Object>> list;
        
        
        public MyAdapter(Context context , List<Map<String,Object>> list){
            
            this.mInflater = LayoutInflater.from(context);
            this.list = list;
        }
        
        
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            
            ViewHolder holder = null;
            
            if (convertView == null) {
              
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.list_item, null);
                holder.name = (TextView)convertView.findViewById(R.id.tv1);
                holder.age = (TextView)convertView.findViewById(R.id.tv2);
                holder.pic = (ImageView)convertView.findViewById(R.id.iv1);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder)convertView.getTag();
            }
            
            holder.name.setText((String)list.get(position).get("name"));
            holder.age.setText((String)list.get(position).get("age"));
            holder.pic.setBackgroundResource((Integer)list.get(position).get("pic"));
            
            return convertView;
        }
        
        
        public final class ViewHolder{
            
            public TextView name;
            public TextView age;
            public ImageView pic;
        }
    
    }
    

        3.4  Activity文件

            

    public class MyActivity extends Activity{
    
        private ListView listview;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mylistview);
          listview = (ListView)findViewById(R.id.mylistview);
          MyAdapter myAdapter = new MyAdapter(this,putData());
          listview.setAdapter(myAdapter);
        }
        
        public List<Map<String,Object>> putData(){
            
            List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
            Map<String,Object> map1 = new HashMap<String,Object>();
            map1.put("name", "张三");
            map1.put("age", "19岁");
            map1.put("pic", R.drawable.friend);
            Map<String,Object> map2 = new HashMap<String,Object>();
            map2.put("name", "李四");
            map2.put("age", "17岁");
            map2.put("pic", R.drawable.ic_launcher);
            Map<String,Object> map3 = new HashMap<String,Object>();
            map3.put("name", "王五");
            map3.put("age", "17岁");
            map3.put("pic", R.drawable.ic_launcher);
            list.add(map1);
            list.add(map2);
            list.add(map3);
            return list;
        }  
    }

    4.参考文章

        【1】https://blog.csdn.net/zhj19940809/article/details/51442363

        【2】https://blog.csdn.net/qq_34487977/article/details/51088239

                    

            

  • 相关阅读:
    【C++程序员学 python】python 的文件类型
    Python如何下载文件
    【C++程序员学 python】python split and join 分割与合并
    知道创宇研发技能表v2.1
    Scapy:局域网MAC地址扫描脚本
    LeetCode: Linked List Cycle II 解题报告
    LeetCode: Insertion Sort List 解题报告
    Lintcode: Minimum Adjustment Cost 解题报告
    LeetCode: Merge Two Sorted Lists 解题报告
    LeetCode: Palindrome Partitioning II 解题报告
  • 原文地址:https://www.cnblogs.com/wangguangjian/p/8831334.html
Copyright © 2020-2023  润新知