文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android移动应用开发学习笔记(listview和适配器的使用)

2022-06-06 13:36

关注

参考:https://www.bilibili.com/video/BV1fs411h7nF 视频做的笔记

文章目录1、用listview和BaseAdapter实现listView的入门1.1、布局文件1.2、MainActivity类2、listview的优化2.1、listview优化的原因:2.2、优化处理:3、listview显示复杂页面(在listview的一个item中显示图片和文字)3.1、activity_main.xml文件3.2、模板item.xml文件3.3、MainActivity 类4、获取打气筒的常用的api4.1、第一种4.2、第二种4.3、第三种5、ArrayAdapter的使用5.1、activity_main.xml文件5.2、item.xml文件5.3、MainActivity 文件6、SimpleAdapter的使用6.1、activity_main.xml文件6.2、MainActivity类7、将数据库中查询出的数据显示到listview中7.1、activity_main.xml文件7.2、item.xml文件7.3、MyOpenHelper类(数据库文件)7.4、MainActivity类8、BaseAdapter、SimpleAdapter、ArrayAdapter三者的区别 1、用listview和BaseAdapter实现listView的入门 在布局中定义listview控件 定义自己的适配器继承BaseAdapter 实现getCount和getView方法 1.1、布局文件

1.2、MainActivity类
package com.dsl.listView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到相应的控件
        ListView lv = (ListView) findViewById(R.id.lv);
        //显示数据
        lv.setAdapter(new MyListAdapter());
    }
    //定义listview适配器
    private class MyListAdapter extends BaseAdapter{
        //展示一共有多少条数据需要显示
        @Override
        public int getCount() {
            return 100000000;
        }
        //返回指定position位置对应的对象
        @Override
        public Object getItem(int position) {
            return null;
        }
        //返回position位置对应的id
        @Override
        public long getItemId(int position) {
            return 0;
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                //创建新的view对象
                 TextView textView= new TextView(MainActivity.this);
            textView.setText("嘻嘻嘻"+position);
            return textView;
        }
    }
}
2、listview的优化 2.1、listview优化的原因:

在使用ListView控件的过程中,由于加载条目过多,在滑动时可能造成卡顿。这是因为ListView在当前屏幕有多少个条目,就会创建多少个对象,每一个条目都是一个对象。在滑动时,滑出屏幕的条目对象会被销毁,新加载到屏幕上的条目会创建新的对象,这样在ListView快速滑动时就会重复一个过程:【创建对象】–>【销毁对象】–>【创建对象】,并且每一个条目都需要加载一次布局,加载布局时会不断进行findViewById()操作初始化控件,而布局XML文件是以树形进行加载,每次加载一个条目都需要从根节点进行初始化,这样对内存消耗也比较大,并且浪费时间。为此就需要对ListView进行优化,优化的目的是在滑动时不会重复创建对象,减少内存消耗和屏幕渲染处理。

2.2、优化处理:

//将上面的getView方法可以替换为下面的代码进行优化
  public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView;
            if (convertView==null){
                //创建新的view对象
                textView = new TextView(MainActivity.this);
            }else{
                //复用历史缓存对象
                textView = (TextView) convertView;
            }
            textView.setText("嘻嘻嘻嘻"+position);
            return textView;
        }
3、listview显示复杂页面(在listview的一个item中显示图片和文字) 在activity_main.xml布局文件中定义listview 定义要显示数据的模板布局文件 定义自己的适配器显示数据 3.1、activity_main.xml文件

3.2、模板item.xml文件

3.3、MainActivity 类
package com.dsl.listview3;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView) findViewById(R.id.lv);
        lv.setAdapter(new MyAdapter());
    }
    private class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return 7;
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            if (convertView==null){
                
             view = View.inflate(getApplication(), R.layout.item, null);
            }else{
                view = convertView;
            }
            return view;
        }
    }
}
4、获取打气筒的常用的api 4.1、第一种
 				
            	 View  view = View.inflate(getApplication(), R.layout.item, null);
4.2、第二种
	 View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);              
4.3、第三种
       LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
       View view = inflater.inflate(R.layout.item, null);
5、ArrayAdapter的使用 在activity_main.xml文件定义listview控件 定义模板item.xml文件 通过适配器显示listview 5.1、activity_main.xml文件

5.2、item.xml文件

5.3、MainActivity 文件
package com.dsl.ArrayAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
	String objects[] = {"一","二","三","四","五","六"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView) findViewById(R.id.lv);
        //创建一个arrayadapter
        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, R.id.tv, objects);
        //设置数据适配器
        lv.setAdapter(adapter);
    }
}
6、SimpleAdapter的使用 6.1、activity_main.xml文件

6.2、MainActivity类
package com.dsl.simpleadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView) findViewById(R.id.lv);
        //准备listview要显示的数据
        List<Map> data = new ArrayList();
        Map map1 = new HashMap();
        map1.put("name","鲁智深");
        map1.put("phone","132546");
        Map map2 = new HashMap();
        map2.put("name","林冲");
        map2.put("phone","1478");
        Map map3 = new HashMap();
        map3.put("name","张飞");
        map3.put("phone","110");
        Map map4 = new HashMap();
        map4.put("name","赵云");
        map4.put("phone","112");
        Map map5 = new HashMap();
        map5.put("name","关羽");
        map5.put("phone","119");
        //把map加入到集合中
        data.add(map1);
        data.add(map2);
        data.add(map3);
        data.add(map4);
        data.add(map5);
        
        SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name", "phone",}, new int[]{R.id.tv_name, R.id.tv_phone});
        //设置数据适配器
        lv.setAdapter(simpleAdapter);
    }
}
7、将数据库中查询出的数据显示到listview中 在布局中添加listview、查询、添加等控件 定义模板文件item.xml 自定义类继承SQLiteOpenHelper实现创建数据库 自定义类继承BaseAdapter实现适配器的操作 写sql语句实现增加和查询 7.1、activity_main.xml文件

   
7.2、item.xml文件

7.3、MyOpenHelper类(数据库文件)
package com.dsl.SqlAndList;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
    
    public MyOpenHelper(Context context) {
        super(context, "test.db", null, 5);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("==========");
        db.execSQL("alter table info add python varchar(20)");
    }
}
7.4、MainActivity类
package com.dsl.SqlAndList;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private  MyOpenHelper myOpenHelper;
    List lists;
    ListView lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lists= new ArrayList();
         lv = (ListView) findViewById(R.id.lv);
        myOpenHelper = new MyOpenHelper(getApplicationContext());
    }
    public void add(View v){
        //获得数据库对象
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        //执行增加语句
       // db.execSQL("insert into info(name,phone) values(?,?)",new Object[]{"李四","123456"});
        
        ContentValues values = new ContentValues();
        values.put("name","李四");
        values.put("phone","120");
        //返回值代表插入新行的id
        long info = db.insert("info", null, values);
        //数据库用完要关闭
        db.close();
        if(info>0){
                Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_SHORT).show();
        }else{
                 Toast.makeText(getApplicationContext(),"添加失败",Toast.LENGTH_SHORT).show();
        }
    }
    public void query(View v){
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        
        Cursor cursor = db.query("info",new String[]{"name", "phone"},null,null, null, null, null);
        if (cursor!=null&&cursor.getCount()>0){
            while(cursor.moveToNext()){
                String name = cursor.getString(0);
                String phone = cursor.getString(1);
               //把数据封装到javabean中‘
                Person p = new Person();
                p.setName(name);
                p.setPhone(phone);
                lists.add(p);
            }
            //设置数据适配器
            lv.setAdapter(new MyAdapter());
        }
    }
    private class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return lists.size();
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            if (convertView==null){
                 view = View.inflate(getApplicationContext(), R.layout.item, null);
            }else{
                view = convertView;
            }
            //找到控件用来显示数据
            TextView name = (TextView)view.findViewById(R.id.tv_name);
            TextView phone = (TextView) view.findViewById(R.id.tv_phone);
            //如何显示数据
            Person person = lists.get(position);
            name.setText(person.getName());
            phone.setText(person.getPhone());
            return view;
        }
    }
}
8、BaseAdapter、SimpleAdapter、ArrayAdapter三者的区别

BaseAdapter:自定义的东西很多,可以做很多复杂的界面显示,更加灵活
SimpleAdapter:SimpleAdapter的扩展性最好,可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示.
ArrayAdapter:只可以简单的显示一行文本


作者:何渡?


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯