谷歌IOS大会提出的这东西 虽然大家都一直在用 可原理啥的大家一知半解
ListView 针对每个item,要求 adapter “返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行;并且ListView缓存了可视范围的View,所以在在你重新查看以前的View时,可以通过tag方式来设置并获取当前数据
简单实例:
- package com.android.listviewtest;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- //定义view缓存对象
- static class HolderView {
- TextView showName;
- TextView showInfo;
- }
- //一次装载 多次显示
- private Map<String, String> maps;
- // 显示的页数
- private int page = 1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- maps=new LinkedHashMap<String, String>();
- for (int i = 0; i < 100; i++) {
- maps.put("熊"+i, "程序员"+i+"号");
- }
- Button btshow = (Button) findViewById(R.id.bt_show);
- ListView showlist = (ListView) findViewById(R.id.listshow);
- final ShowName showName = new ShowName();
- showlist.setAdapter(showName);
- btshow.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (page< 100 / 5) {
- page++;
- showName.notifyDataSetChanged();
- }else{
- Toast.makeText(MainActivity.this, "没有多余的数据了", Toast.LENGTH_LONG).show();
- }
- }
- });
- }
- class ShowName extends BaseAdapter {
- // 每次加载5条数据
- @Override
- public int getCount() {
- return page * 5;
- }
- @Override
- public Object getItem(int position) {
- return position;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- HolderView holderView;
- //判断每一个item中的view是否已经存在
- if (convertView == null) {
- //加载view
- convertView = LayoutInflater.from(MainActivity.this).inflate(
- R.layout.show_name, null);
- holderView = new HolderView();
- holderView.showName = (TextView) convertView
- .findViewById(R.id.txt1);
- holderView.showInfo = (TextView) convertView
- .findViewById(R.id.txt2);
- //添加一个额外的数据
- convertView.setTag(holderView);
- } else {
- holderView = (HolderView) convertView.getTag();
- }
- String name=((maps.keySet().toArray())[position]).toString();
- String info=maps.get(name);
- holderView.showName.setText(name);
- holderView.showInfo.setText(info);
- return convertView;
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }