android 34 ListView进阶

时间:2022-06-04 13:34:09

android 34   ListView进阶

public View getView(int position, View convertView, ViewGroup parent) {////convertView是一个缓存,每次返回一个layout给系统,安卓系统根据layout的布局和数据进行显示,
//这个layout同时会保存在convertView中,convertView缓存layout的个数为屏幕显示的列表的个数,
//但屏幕滚动的时候,会删除出屏幕了的数据加进新显示的数据,保证同一时间仅仅显示一个屏幕的数量的数据。
View layout=View.inflate(MainActivity.this, R.layout.item_generals, null);
}

MainActivity.java

package com.sxt.day05_10;

import java.util.ArrayList;
import java.util.List; import com.sxt.day05_10.entity.ContactBean; 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 { //MVC
ListView mlvContact;
List<ContactBean> mContacts;
ContactAdapter mAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
} private void initView() {
mlvContact=(ListView) findViewById(R.id.lvContact);
mAdapter=new ContactAdapter(mContacts, this);//这里通过构造器将数据穿进去,好处是低耦合,内部类和外部类仅仅通过构造器进行数据的传递,没有别的地方有关联。以后将内部类提取出去成外部类的时候修改的代码量会少。
mlvContact.setAdapter(mAdapter);
} private void initData() {
String[] names=getResources().getStringArray(R.array.names);//字符串数组资源
String[] phones=getResources().getStringArray(R.array.phones);
mContacts=new ArrayList<ContactBean>();
for (int i = 0; i < phones.length; i++) {
ContactBean contact=new ContactBean(names[i], phones[i]);
mContacts.add(contact);
}
} class ContactAdapter extends BaseAdapter{
List<ContactBean> contacts;
MainActivity context; public ContactAdapter(List<ContactBean> contacts, MainActivity context) {
super();
this.contacts = contacts;
this.context = context;
} @Override
public int getCount() {
return contacts.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
//convertView是一个缓存,缓存一屏幕数量的列表项,缓存是一个convertView缓存一个holder,一个hoder就是一条数据
Log.i("main","position="+position);//如果一屏幕有10条,则第一屏getView函数调用10次,分别打印0-9,
ViewHolder holder=null;
if(convertView==null){//第一屏中没有返回那个layout所以convertView这个缓存为null,因为是新的所以convertView和holder都要重新创建并把holder加入convertView中,
convertView=View.inflate(context, R.layout.item_contact, null);//将资源文件item_contact.xml创建出来
holder=new ViewHolder();
holder.tvName=(TextView) convertView.findViewById(R.id.tvName);
holder.tvPhone=(TextView) convertView.findViewById(R.id.tvPhone);
convertView.setTag(holder);//tag属性是View类的属性,是Object类型,现在convertView里面有了一屏幕数量的列表项数据了(一个convertView缓存一个holder)。
}else{//以后的滚动,出现其他的列表项,直接从缓存中取出来(旧的布局,convertView和holder已经存在了并且已经加入进去了,但是数据还是要重新设置进去)
holder=(ViewHolder) convertView.getTag();
}
//新的数据出现在屏幕的时候调用
ContactBean contact=contacts.get(position);
holder.tvName.setText(contact.getName());
holder.tvPhone.setText(contact.getPhone());
return convertView;//系统根据convertView进行显示
} class ViewHolder{
TextView tvName,tvPhone;
}
}
}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/lvContact"
android:layout_width="match_parent"
android:layout_height="match_parent" layout_height和layout_width都要设置成match_parent,否则不能利用缓存机制
android:divider="#ccc"
android:dividerHeight="10dp"/> </RelativeLayout>
item_contact.xml
<?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/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="张飞"/>
<TextView
android:id="@+id/tvPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="13577889966"
android:layout_marginLeft="10dp"
android:textSize="20sp"/> </LinearLayout>

ContactBean.java

public class ContactBean {

    private String name;
private String phone;
public String getName() {
return name;
}

android 34 ListView进阶的更多相关文章

  1. 我的Android进阶之旅------>Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  2. 转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

    其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter.还有一种是 ...

  3. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

  4. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  5. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  6. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  7. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  8. android——自定义listView

    都知道微信主机面 有个界面会一行一一行的聊天记录,那个效果就可以用listview来实现(当然这只是其中的一种) listView是一种比较常见的组件它用来展示列的view,它是根据数据的长度来显示数 ...

  9. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

随机推荐

  1. PHP&lowbar;Const

    PHP_Const 常量 规则: 1 总是大写 2 A-Z 及 从127-255的ASCII字符 3 全局范围 4 用define函数定义 5 只能包含标量数据 如Boolean integer fl ...

  2. ActiveMQ&comma; Qpid&comma; HornetQ and RabbitMQ in Comparison

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. Win7 64位下配置Qt5&period;3和Wincap

         最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit ( ...

  4. web app之rem

    rem是什么? rem:font size of the root element,是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位. em:font size of the elemen ...

  5. application,session,cookie三者之间的区别和联系

    application:    程序全局变量对象,对每个用户每个页面都有效 session:    用户全局变量,对于该用户的所有操作过程都有效    session主要是在服务器端用,一般对客户端不 ...

  6. ES7 Async&sol;Await 陷阱

    什么是Async/Await ES6新增了Promise函数用于简化项目代码流程.然而在使用promise时,我们仍然要使用callback,并且并不知道程序要干什么,例如: function doS ...

  7. react context跨组件传递信息

    从腾讯课堂看到的一则跨组件传递数据的方法,贴代码: 使用步骤: 1.在产生参数的最*组建中,使用childContextTypes静态属性来定义需要放入全局参数的类型 2.在父组件中,提供状态,管理 ...

  8. DB2 Version 10&period;5 补丁下载

    DB2 Version 10.5 for Linux, UNIX, and Windows fix pack summary https://www.ibm.com/support/knowledge ...

  9. Laravel传值总结

    Laravel传值:with,view(),compact方法一:with public function index() { $title = '文章标题1'; return view('artic ...

  10. Java Switch支持的类型问题

    常见支持类型为int,byte,short,char及枚举类型.以上是JDK1.6以前的版本.JDK1.7时,又增加了String. 参考资料:1.java switch支持的数据类型 2.java中 ...