ListView
文章目录
- ListView
- 一、什么是ListView
- 二、ListView入门
- 1.ListView核心类
- 2.代码编写步骤
- 三、ListView优化
- 四、把复杂界面(通过xml文件实现)显示到ListView上
- 1.View的静态方法
- 2.获取LayoutInflater对象
- 五、SimpleAdapter & ArrayAdapter的使用
- 1.ArrayAdapter
- 2.SimpleAdapter
- 六、ListView显示数据原理(MVC)
一、什么是ListView
在众多移动应用中,能看到各式各样的表格数据
在Android中,要实现表格数据展示,最常用的做法就是使用ListView
ListView-支持垂直滚动,而且性能极佳
二、ListView入门
1.ListView核心类
(1)ListView
setAdapter 设置一个适配器
(2)BaseAdapter
getcount
getItem
getId
getView
2.代码编写步骤
(1)布局中声明listview节点==(注意:listview的高度不要使用包裹内容)==
<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.listiview.MainActivity" ><ListView android:id="@+id/lv_list"android:layout_width="match_parent"android:layout_height="match_parent"android:fastScrollEnabled="true"></ListView></RelativeLayout>
(2)在Activity的oncreate方法中findviewbyid 找到 listView 控件
package com.example.listview;import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.os.Build;public class MainActivity extends Activity {private ListView lv_list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[1]找到对应的空间lv_list = (ListView) findViewById(R.id.lv_list);//[2]显示数据 通过一个数据适配器lv_list.setAdapter(new myListAdapter());}//定义一个直接子类 public class myListAdapter extends BaseAdapter{//显示多少个条目@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 10000;}//返回对应的条目内容@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}//返回 对应位置的id@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}//对应item的View@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stub
// TextView tv_text = new TextView(getApplicationContext());
// tv_text.setText("显示的内容位置:"+position);
// return tv_text;/*** 如果这么去写 程序会崩溃* 内存溢出 :原因是 垃圾回收机制 没有创建的快* */TextView tv_text;if (convertView == null) {tv_text = new TextView(getApplicationContext());tv_text.setText("convertView == null创建了一个新的对象,显示的内容位置:"+position);}else {tv_text = (TextView) convertView;tv_text.setText("convertView不为空 复用旧的view,复用:"+position);}return tv_text;}}}
三、ListView优化
思路:
重用convertView 判断convertView 是否为空 如果为空则需创建新的view对象 如果不为空则直接使用convertView
Listview的高度 一定是匹配父控件或者指定高度,绝对不允许将高度设置成包裹内容
四、把复杂界面(通过xml文件实现)显示到ListView上
把一个xml文件转化为View对象的几种写法
1.View的静态方法
View.inflate (这种方式比较方便)
2.获取LayoutInflater对象
通过LayoutInflater的inflate方法实现
获取LayoutInflater对象方式一 LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
获取LayoutInflater对象方式二 LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
(谷歌源码中采用的这种方式)
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v;if (convertView == null) {//把xml文件转化为 view对象的第一种方式 通过View的inflate方法//第一个参数 上下文//第二个参数 要转化成view对象 对应的布局id//第三个参数 viewGroup 是一个特殊的View对象 它可以加入子view 比如 LinearLayout RelativeLayout都是ViewGroup//如果这个参数传了值 那么创建出来的view 就是这个view的子view 我们在getview方法中 主要目的是把xml文件转化成view对象 显示在listview中//不需要加入到其他viewgroup中 所以这个参数传null就可以了//打气筒 将是XML 转换成View 对象 的三种方式v = View.inflate(getApplicationContext(), R.layout.items, null);//LayoutInflater 也有 inflate方法
// v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.items, null);//ArrayAdapter源码 采用的这种方式获取的打气筒 通过打气筒把xml布局文件转化为view对象
// LayoutInflater systemService = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
// v=systemService.inflate(resource, root);}else {v = convertView;}return v;}}
五、SimpleAdapter & ArrayAdapter的使用
1.ArrayAdapter
public class MainActivity2 extends Activity {private String datas[] = new String[]{"张小军","张欣","张丹丹"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView lv_list = (ListView) findViewById(R.id.lv_list);//第二个参数 用来显示数据的布局文件ID//第三个参数 布局文件中用来展示数据的具体的textview的id//第三个参数 String数组 用来显示的数据源ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item,R.id.tv_test, datas);lv_list.setAdapter(adapter);}
}
2.SimpleAdapter
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView lv_list = (ListView) findViewById(R.id.lv_list);//List<map> 用来填充数据的List<Map<String, String>> data = new ArrayList<Map<String,String>>();Map<String, String> map1 = new HashMap<String, String>();map1.put("title", "中国足球又输了");map1.put("content", "2016冲击失败");data.add(map1);Map<String, String> map2 = new HashMap<String, String>();map2.put("title", "沪android12期高薪就业");map2.put("content", "平均薪水20K");data.add(map2);String[] from ={"title","content"};int[] to = {R.id.tv_title,R.id.tv_content};//第二个参数 数据map的List//第三个参数 用来显示数据的布局文件//第四个参数 String数组 数据List中 每一条数据的 key//第五个参数 数据List中 的文字内容 对应的 要显示此内容的 textView的idSimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item2, from, to);lv_list.setAdapter(adapter);}
}