• 对于ListView的一些用法(一)


    • ScrollView:只能用于控件比较少的界面,如果数据有上千上万条,那么使用ScrollView就不好了,因为ScrollView就把所有的控件进行初始化,这是非常消耗性能的操作,所以android就设计了一个类ListView来专门处理列表数据条目的显示。
    • ListView:处理条目比较多,并且每个条目都非常相似的场景。就是一个条目控件,会自动回收没有在屏幕上显示的控件,来优化性能。

    对于ListView和BaseAdapter

    1简单的用法

    MainActivity.java

    package com.example.listview;
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    public class MainActivity extends Activity {
        protected static final String TAG = "MainActivity";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //找到ListView
            ListView lv = (ListView) findViewById(R.id.lv);
            //给ListView设置数据(设置适配器     基本适配器)
            lv.setAdapter(new BaseAdapter() {
                //加工ListView需要的条目    int position 条目的下标
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    Log.i(TAG, "position:"+position);
                    TextView tv = new TextView(MainActivity.this);
                    tv.setText("人生自古谁没有年轻的时候"+position);
                    tv.setTextSize(20);
                    return tv;
                }
                @Override
                public long getItemId(int position) {
                    return 0;
                }
                @Override
                public Object getItem(int position) {
                    return null;
                }
                //控制条目的数量
                @Override
                public int getCount() {
                    return 100;
                }
            });
        }
    }

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
        <ListView 
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </LinearLayout>

    image

    上图就是ListView控件的基本图像

    2复杂ListView的用法

    首先要创建一个ListView和一个条目上的内容

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <ListView 
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:id="@+id/lv">
        </ListView>
    
    </RelativeLayout>

    item.xml

    <?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="wrap_content" >
        
        <ImageView 
            android:id="@+id/iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"/>
        
        <TextView 
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/iv"
            android:layout_marginTop="10dp"
            android:textSize="22sp"
            android:text="姓名"/>
        <TextView 
            android:id="@+id/tv_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/iv"
            android:layout_below="@id/tv_name"
            android:textSize="16sp"
            android:text="年龄"/>
    
    </RelativeLayout>

    image

    布局填充器layoutinflate:可以把res/layout下面的资源加载到内存,即可以把xml布局变成Java对象。一般就是加载item.xml上的东西

    MainActivity.java

    package com.example.listiview;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    import cn.itcast.wh08.lv.domain.Teacher;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            ListView lv = (ListView) findViewById(R.id.lv);
            //模拟对象集合的数据 一般数据都是来自于网络,或者数据库       
            List<Teacher> data = new ArrayList<Teacher>();
            for(int i = 0;i<100;i++){
                data.add(new Teacher(i, "隔壁老王"+i, i+20));
            }
            //适配器
            MyAdapter adapter = new MyAdapter(data, this);
            //设置适配器
            lv.setAdapter(adapter);
        }
    
        //适配器
        private class MyAdapter extends BaseAdapter{
            private List<Teacher> data;
            private Context context;
            private LayoutInflater mInflater;
            
            public MyAdapter(List<Teacher> data, Context context) {
                super();
                this.data = data;
                this.context = context;
                //获取布局加载器
                mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }
    
            @Override
            public int getCount() {
                return data.size();
            }
    
            //返回条目指定位置的数据
            @Override
            public Object getItem(int position) {
                return data.get(position);
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
    
            //加工条目
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //使用布局加载器加载布局
                View view = mInflater.inflate(R.layout.item, null);
                //找到条目对应的控件
                TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
                TextView tv_age = (TextView) view.findViewById(R.id.tv_age);
                //获取条目对应的数据
                Teacher info = data.get(position);
                //把数据绑定给控件
                tv_name.setText(info.name);
                tv_age.setText(info.age+"");
                return view;
            }
            
        }
    
    }

    Teacher.java

    package com.example.listview.vo;
    
    public class Teacher {
        public int _id;
        public String _name;
        public int age;
    
        public Teacher(int _id, String _name, int age) {
            super();
            this._id = _id;
            this._name = _name;
            this.age = age;
        }
    
        public Teacher() {
            super();
        }
        
    }

    image

    3.与数据库结合来显示

    • mode 数据模型(数据) :要被显示到ListView上的数据集合
    • view 视图(展示数据) : ListView
    • controller控制层(把数据展示到空间上) : 适配器Adapter

    image

    我们还是要先建立ListView控件和item控件

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingBottom="5dp"
            android:paddingTop="5dp"
            android:text="闺蜜列表"
            android:textSize="22sp" />
    
        <ListView
            android:id="@+id/lv"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    - 
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/bt_pre"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:enabled="false"
                android:text="上一页" />
    
            <Button
                android:id="@+id/bt_next"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="下一页" />
        </LinearLayout>
    
    </LinearLayout>

    item.xml

    <?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/iv_head"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />
    
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/iv_head"
            android:text="老师" />
    
        <TextView
            android:id="@+id/tv_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_name"
            android:layout_toRightOf="@id/iv_head"
            android:text="13787009878" />
    
    </RelativeLayout>

    先建立一个数据库,为了得到数据。

    MySqliteOpenHelper.java

    package com.example.lisview.db;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MySqliteOpenHelper extends SQLiteOpenHelper {
    
        private static SQLiteOpenHelper mInstance;
    
        public static synchronized SQLiteOpenHelper getInstance(Context context) {
            if (mInstance == null) {
                mInstance = new MySqliteOpenHelper(context, "itcast.db", null, 1);
            }
            return mInstance;
        }
    
        public MySqliteOpenHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 设计一个表
            db.execSQL("create table friends(_id integer primary key autoincrement,"
                    + "name text," + "phone text)");
            // 初始化表数据
            ContentValues values = new ContentValues();
            for (int i = 0; i < 100; i++) {
                values.clear();
                values.put("name", "老师" + i);
                values.put("phone", "13787990" + i);
                db.insert("friends", null, values);
            }
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
    
        }
    
    }

    Friend.java

    package com.example.lisview.vo;
    
    public class Friend {
        public int _id;
        public String name;
        public String phone;
        public Friend(int _id, String name, String phone) {
            super();
            this._id = _id;
            this.name = name;
            this.phone = phone;
        }
        public Friend() {
            // TODO Auto-generated constructor stub
        }
    }

    对数据库的增、删、查、改

    FriendDao.java

    package com.example.lisview.dao;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    import com.example.lisview.db.MySqliteOpenHelper;
    import com.example.lisview.vo.Friend;
    
    public class FriendDao {
        private Context context;
        private SQLiteOpenHelper helper;
    
        public FriendDao(Context context) {
            this.context = context;
            helper = MySqliteOpenHelper.getInstance(context);
        }
        
        /**
         * 获取数据的总条目
         * @return
         */
        public int queryAllSize(){
            int size = 0;
            SQLiteDatabase db = helper.getReadableDatabase();
            if(db.isOpen()){
                Cursor cursor = db.query("friends", new String[]{"*"}, null, null, null, null, null);
                size = cursor.getCount();//获取Cursor的大小
                cursor.close();
                db.close();
            }
            return size;
        }
    
        /**
         * 分页查询的
         * 
         * @param startIndex
         *            查询的开始下标
         * @param block
         *            每次查询的数据量
         * @return
         */
        public List<Friend> queryFriendsLimit(int startIndex, int block) {
            List<Friend> infos = new ArrayList<Friend>();
            SQLiteDatabase db = helper.getReadableDatabase();
            if (db.isOpen()) {
                Cursor cursor = db.query("friends", new String[] { "*" }, null,
                        null, null, null, null, startIndex + "," + block);
                while (cursor.moveToNext()) {
                    int _id = cursor.getInt(0);
                    String name = cursor.getString(1);
                    String phone = cursor.getString(2);
                    infos.add(new Friend(_id, name, phone));
                }
                cursor.close();
                db.close();
            }
            return infos;
        }
    }

    MyAdapter.java

    package com.example.lisview.service;
    
    import java.util.List;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import com.example.lisview.R;
    import com.example.lisview.vo.Friend;
    
    public class MyAdapter extends BaseAdapter {
        private List<Friend> infos;
        private LayoutInflater mInflater;
    
        public void setInfos(List<Friend> infos) {
            this.infos = infos;
        }
    
        public MyAdapter(List<Friend> infos, Context context) {
            super();
            this.infos = infos;
            // 布局加载器
            mInflater = LayoutInflater.from(context);
        }
    
        // 返回条目的总数
        @Override
        public int getCount() {
            return infos.size();
        }
    
        // 得到item.xml代表的对象
        @Override
        public Object getItem(int position) {
            return infos.get(position);
        }
    
        // 得到Item的id,不过在这里貌似没有用
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        // 得到Item的视图
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = mInflater.inflate(R.layout.item, null);
            TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
            TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
    
            Friend info = infos.get(position);
    
            tv_name.setText(info.name);
            tv_phone.setText(info.phone);
            return view;
        }
    
    }

    MainActivity.java

    package com.example.lisview;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.ListView;
    
    import com.example.lisview.dao.FriendDao;
    import com.example.lisview.service.MyAdapter;
    import com.example.lisview.vo.Friend;
    
    public class MainActivity extends Activity {
    
        private ListView lv;
        private Button bt_pre;
        private Button bt_next;
        private FriendDao friendDao;
        private int block = 10;// 每一页获取10条数据
        private int startIndex = 0;// 获取数据的下标
        private MyAdapter adapter;
        private int size;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            lv = (ListView) findViewById(R.id.lv);
            bt_pre = (Button) findViewById(R.id.bt_pre);
            bt_next = (Button) findViewById(R.id.bt_next);
    
            MyOnClickListener l = new MyOnClickListener();
            bt_pre.setOnClickListener(l);
            bt_next.setOnClickListener(l);
    
            friendDao = new FriendDao(this);
            size = friendDao.queryAllSize();
            // 查询第一页数据
            List<Friend> infos = friendDao.queryFriendsLimit(0, block);
            adapter = new MyAdapter(infos, this);
            lv.setAdapter(adapter);
            // 设置条目点击事件
            lv.setOnItemClickListener(new MyOnItemClickListener());
        }
    
        private class MyOnItemClickListener implements OnItemClickListener {
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                //获取条目的数据
                final Friend info = (Friend) adapter.getItem(position);
                //弹出对话框
                new AlertDialog.Builder(MainActivity.this)
                .setTitle(info.name)
                .setMessage("请选择操作")
                .setPositiveButton("打电话", new DialogInterface.OnClickListener() {
                    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //打电话需要拨号权限
                        Intent intent = new Intent();
                        intent.setAction(Intent.ACTION_CALL);
                        intent.setData(Uri.parse("tel:"+info.phone));
                        startActivity(intent);
                    }
                })
                .setNegativeButton("发短信", new DialogInterface.OnClickListener() {
                    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //TODO:学员自己处理
                    }
                })
                .show();
            }
    
        }
    
        private class MyOnClickListener  implements OnClickListener {
    
            @Override
            public void onClick(View v) {
                List<Friend> infos = null;
                switch (v.getId()) {
                case R.id.bt_pre:
                    startIndex = startIndex - block;
                    if (startIndex == 0) {
                        bt_pre.setEnabled(false);
                    } else {
                        bt_pre.setEnabled(true);
                    }
                    bt_next.setEnabled(true);
                    infos = friendDao.queryFriendsLimit(startIndex, block);
                    adapter.setInfos(infos);// 把查询的数据设置给适配器
                    // 刷新界面
                    adapter.notifyDataSetChanged();
                    break;
    
                case R.id.bt_next:
                    startIndex = startIndex + block;
                    // 判断是否是最后页面的数据
                    // 现在页面的数据 startIndex=startIndex+block
                    if ((startIndex + block) >= size) {
                        // 已经是最后一页数据
                        bt_next.setEnabled(false);
                    } else {
                        bt_next.setEnabled(true);
                    }
                    bt_pre.setEnabled(true);
                    infos = friendDao.queryFriendsLimit(startIndex, block);
                    adapter.setInfos(infos);// 把查询的数据设置给适配器
                    // 刷新界面
                    adapter.notifyDataSetChanged();
                    break;
    
                default:
                    break;
                }
            }
    
        }
    
    }
    image
    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    关于10月20日#8的六道题的心得与感悟
    关于10月19日#7的六道题的心得与感悟
    关于10月17日#6的五道数据结构题的心得与感悟
    关于10月16日模拟赛的心得与感悟
    关于10月15日#5的四道图论题的心得与感悟
    关于10月14日#4的四道图论题的心得与感悟
    关于跨进程通信AIDL的一些总结
    对App应用架构搭建的一些思考
    Java 实例化接口或抽象类
    使用ViewPager实现卡片叠加效果
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/5225440.html
Copyright © 2020-2023  润新知