安卓,ListView,打气筒的初次使用
Posted 孤舟一夏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓,ListView,打气筒的初次使用相关的知识,希望对你有一定的参考价值。
先来介绍一下ListView这么个东西,适合用在一排数据的展示中,
例如,这样的一个就是使用了List View这么一个控件实现功能
实现的思路主要是这样
在布局里面加一个ListView像是这样,以下代码是常用的他的一些方法
<ListView android:id="@+id/lv" //加一个id号 android:layout_width="match_parent" //设置宽度高度 android:fastScrollEnabled="true" //实现一个下滑块,方便一下到底 android:layout_height="match_parent"></ListView>
然后在MainActivity中找到这个控件,然后为他增加一个适配器。
适配器我们最先介绍一个叫做BaseAdapter的适配器,这个比较洋气
比较好用,
实现的效果是上面的那一个图
package com.example.xialm.list_test2; 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 ll = (ListView)findViewById(R.id.lv); //设置适配器 ll.setAdapter(new myad()); } //开始编写适配器 public class myad extends BaseAdapter{
//下面是Base Adapter的四个构造方法, @Override public int getCount() { //实现几个条目的显示 return 100000; } @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) { TextView tv; if(convertView == null){ //创建新的缓存对象 tv = new TextView(MainActivity.this); }else{ //复用新的缓存对象 tv = (TextView)convertView; } int s = position+1; tv.setText("你好,你是第"+s+"个世界"); return tv; } } }
既可实现,
那么我们可以看到上面那个有点low,像我们手机上那种洋气一点的布局是怎么做的呢,
最起码得实现一个这样的布局把
如下:
这个好像还可以接受一小下下,那么我们现在的数据是我们自己造的,我们在后面会提到
如何从其他的地方拿到我们需要的东西然后再放到我们的LIst View上面来显示,
尤其是数据库中的数据放到我们的界面上
先不剧透了,先来搞上面的那个界面,
有第一个案例来说, 我们可以发现要做出这样的案例,只需要改动我们Adapter里面的一个
叫做getView 这个方法就可以了,
也就是我们要改动的是这一块
@Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv; if(convertView == null){ //创建新的缓存对象 tv = new TextView(MainActivity.this); }else{ //复用新的缓存对象 tv = (TextView)convertView; } int s = position+1; tv.setText("你好,你是第"+s+"个世界"); return tv; }
整体的框架我们不需要改动,尤其是if 和 else这一段逻辑
解释一下这一段逻辑是用来实现将我们的程序内存最大的优化
是我们的app的运行更加流畅,使资源不会因为还没有释放之前,
就内存溢出了
那么我们改动哪一块呢,
应该是textview那一快
看上去这样只能显示一行的内容,我们现在想要在左边显示一个图片,
在右边显示两个文本框框,这个明显涉及到了布局
我们再回首看我们的代码的时候发现,我们代码中写的我们只能显示view
当然TextView是View的一种啦
那么顺理成章的,现在可以将目光和思路引导到我们实现 将布局文件转换为 view的伟大道路上
Android底层的工程师为我们创建了这么一个api正好是可以进行实现我们的功能
江湖人称,打气筒,
总结一下,一切思路和上面第一个案例一样,
我们只需要改变Adapter中第四个构造方法中的view
想实现那个就必须要将layout文件转换为view,我们引进了一个技术叫做打气筒
下面是代码
xml
main
只有一个listview控件
<?xml version="1.0" encoding="utf-8"?> <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.xialm.listview_3.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:fastScrollEnabled="true" android:layout_height="match_parent"></ListView> </RelativeLayout>
xml
item
这个是我们每一个显示条目的格式,
大概就是这样,左边是一个图片,右边是两个文本框,上面一个大一点的下面是一个小一点的
在代码中需要实现一个打气筒的步骤这一步是将一个layout布局变成一个view,
这样来实现,能够把一个布局变成一个view,显示到listview中
下面是逻辑代码
package com.example.xialm.listview_3; import android.app.AlertDialog; import android.content.DialogInterface; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.KeyEvent; 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 java.util.List; import java.util.zip.Inflater; public class MainActivity extends AppCompatActivity { AlertDialog builder=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到List View这个我们关心的对象 ListView lv_ =(ListView)findViewById(R.id.lv); //给我们的lv_一个适配器,用于给我们的lv_加上数据 lv_.setAdapter(new Myad()); //做完这一步之后就是建类,是一个我们的适配器类,这里是继承了BaseAdapter } //当用户选择点击返回的时候,给用户以友好的提示 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { builder = new AlertDialog.Builder(MainActivity.this) .setTitle("温馨提示:") .setMessage("您是否要退出程序?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { MainActivity.this.finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { builder.dismiss(); } }).show(); } return true; } //自己定义一个类继承baseadapter public class Myad extends BaseAdapter { @Override public int getCount() { //创建多少个项目 return 500; } @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对象 //view = View.inflate(MainActivity.this,R.layout.itemm,null); //将布局文件不仅转换成了view,而且最后一个参数用来做了一个组, // 可以把刚生成的view添加进来 //打气筒的第二种方法 view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.itemm,null); //打气筒的第三种方法 //LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); //view = inflater.inflate(R.layout.itemm,null); }else { //复用旧的view对象 view = convertView; } return view; } } }
下面介绍一个比较简单的数组适配器,arrayadapter
相比于上面的那一个我们可以看出来,好像使用第一个baseadapter也可以实现同样的功能,
是的,因为数组适配器的出现就是为了显示数组中的基本内容,并且是显示到一个文本框框里面,
我们知道数据适配器的作用就是用来实现,把数据和显示连接在一起,像是数据-->适配器-->显示器,这样一个过程
那么,需求如果是很简单的内容,我们是不是还需要使用复杂的适配器呢,
当然不用,这里提供一个适配器叫做数组适配器,使用方法简单
使用的场合是仅显示一行文字的时候使用
下面是代码‘
xml:mainactivity
<?xml version="1.0" encoding="utf-8"?> <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.xialm.arrayadapter.MainActivity"> <ListView android:id="@+id/lv_1" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView> </RelativeLayout>
xml:item
<?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" android:orientation="horizontal" > <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="#000" /> <TextView android:id="@+id/tv_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="#999" /> </LinearLayout>
逻辑代码
package com.example.xialm.arrayadapter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到关心的控件 ListView ll = (ListView)findViewById(R.id.lv_1); //定一个数组为了加进去 String objects[] = {"你好","世界","hello","world"}; //搞一个数组适配器,将数组里面的内容展示到我们的listview上 //但是我们的这个适配器有一个局限性,智能显示一个textview,要实现更多的功能还是需要使用复杂一点的适配器, ArrayAdapter<String> myadd = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_name,objects); //ArrayAdapter<String> myadd1 = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_number,objects); //设置数据适配器 ll.setAdapter(myadd); //ll.setAdapter(myadd1); } }
下面一种是simpleadapter
集合里面放字典
字典里面放键值对
使用设置好的集合配置 simpleadapter
xml main
<?xml version="1.0" encoding="utf-8"?> <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="com.example.xialm.simpleadapter.MainActivity"> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="姓名" /> <TextView android:id="@+id/tv_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="电话" /> </LinearLayout> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/lv_1" android:layout_below="@+id/ll" > </ListView> </RelativeLayout>
xml item
<?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" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/tv_3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="姓名" /> <TextView android:id="@+id/tv_4" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="电话" /> </LinearLayout> </LinearLayout>
逻辑代码
package com.example.xialm.simpleadapter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; 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_1); //准备listview要显示的数据 List<Map<String,String>> data1 = new ArrayList<Map<String, String>>(); //准备map放入list, Map<String,String> map1 = new HashMap<String,String>(); map1.put("name","猪哥"); map1.put("phone", "663924"); Map<String,String> map2 = new HashMap<String,String>(); map2.put("name","梅鸣"); map2.put("phone", "662086"); Map<String,String> map3 = new HashMap<String,String>(); map3.put("name","你岩"); map3.put("phone","662110"); data1.add(map1); data1.add(map2); data1.add(map3); SimpleAdapter mysim = new SimpleAdapter(MainActivity.this,data1,R.layout.item,new String[]{"name","phone"},new int[]{R.id.tv_3,R.id.tv_4}); //上下文,要显示在哪个界面上的 //数据,这个数据是一个list,里面有map的一个数据, //加载的界面 //这个是显示的列, //列里面显示什么,因为id号是int所以使用int数组 //配置这个适配器 lv.setAdapter(mysim); } }
以上是关于安卓,ListView,打气筒的初次使用的主要内容,如果未能解决你的问题,请参考以下文章
安卓源代码----安卓系统启动过程(初次研究源代码,表述不当还请见谅)
片段中 ListView 的 setOnItemClickListener