创建两个Activity,都是ListView,第一个点击按钮可以跳转到第二个Activity,第一个是字符串的tem,第二个是用图片组为item
原始的ViewHodler代码实现如
MainActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
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 Activity {
private ListView lv;//lv是布局中的组件
private List<String> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化填充的数据有100条
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("qqqqqqqqaa"+i);
}
lv=(ListView) findViewById(R.id.lv);
lv.setAdapter(new MainAdapter());
}
//按钮点击事件,用来跳转到第二个Activity
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
class MainAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//ConvertVierw是移动出屏幕的View对象,可以用来复用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
MainHolder holder;
//组件没有就创建
if(convertView == null){
view=View.inflate(getApplicationContext(), R.layout.item_main, null);
//创建一个Holder用于存放布局中的组件
holder = new MainHolder();
holder.tv = (TextView) view.findViewById(R.id.tv);
//把组件设置到holder中
view.setTag(holder);
}else{
//组件有了直接从convertView中获取,此时view=convertView
view = convertView;
//获取到组件
holder = (MainHolder) view.getTag();
}
//获取位置组件
String string = datas.get(position);
//设置组件
holder.tv.setText(string);
return view;
}
class MainHolder{
TextView tv;
}
}
}
SecondActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class SecondActivity extends Activity{
private ListView lv_second;//lsitview,lv_second是布局中的组件
private List<Drawable> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
//初始化填充的数据有100条,填充的是图片
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
}
lv_second.setAdapter(new SecondAdapter());
}
class SecondAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
SecondHolder holder;
if(convertView == null){
view = View.inflate(getApplicationContext(), R.layout.item_second, null);
//创建一个Holder用于存放布局中的组件
holder = new SecondHolder();
holder.iv = (ImageView) view.findViewById(R.id.iv);
//把组件设置到holder中
view.setTag(holder);
}else{
//组件有了直接从convertView中获取,此时view=convertView
view = convertView;
//获取到组件
holder = (SecondHolder) view.getTag();
}
//获取位置组件
Drawable drawable = datas.get(position);
//设置组件
holder.iv.setImageDrawable(drawable);
return view;
}
}
class SecondHolder{
ImageView iv;
}
}
第二步:摘取
创建一个DefaultAdapter这个继承BaseAadpter,之后的2个Adapter都是继承这个来实现的,因为有2个adapter分别带不同的参数进来,因此DefaultAdapter需要设置成泛型,并通过构造函数来获取到下面传递上来的数据。再将ViewHolder中进行优化,getView中的方法尽量在ViewHolder中实现,减少getView的代码量
DefaultAdapter.java
package com.example.listviewyouhua;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
//使用泛型来实现
public class DefaultAdapter<T> extends BaseAdapter{
//不确定类型,使用泛型
private List<T> datas;
//构造方法来获取到下面传递上来的参数
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return null;
}
}
MainActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
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 Activity {
private ListView lv;//lv是布局中的组件
private List<String> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化填充的数据有100条
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("qqqqqqqqaa"+i);
}
lv=(ListView) findViewById(R.id.lv);
//需要传递数据,用构造函数初始化
lv.setAdapter(new MainAdapter(datas));
}
//按钮点击事件,用来跳转到第二个Activity
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
private class MainAdapter extends DefaultAdapter<String>{
//构造函数,传递数据
public MainAdapter(List<String> datas){
super(datas);
}
//ConvertVierw是移动出屏幕的View对象,可以用来复用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MainHolder holder;
//组件没有就创建
if(convertView == null){
//创建一个Holder用于存放布局中的组件
holder = new MainHolder();
//获取到view对象
holder.getContentView();
}else{
//获取到组件
holder = (MainHolder) convertView.getTag();
}
//获取位置组件
String string = datas.get(position);
//设置布局
holder.refreshView(string);
return holder.getContentView();
}
class MainHolder{
TextView tv;
private View view;
public MainHolder(){
view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv = (TextView) view.findViewById(R.id.tv);
//把组件设置到holder中
view.setTag(this);
}
//获取到view
public View getContentView() {
return view;
}
public void refreshView(String string){
//设置组件
this.tv.setText(string);
}
}
}
}
SecondActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class SecondActivity extends Activity{
private ListView lv_second;//lsitview,lv_second是布局中的组件
private List<Drawable> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
//初始化填充的数据有100条,填充的是图片
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
}
//需要传递数据,用构造函数初始化
lv_second.setAdapter(new SecondAdapter(datas));
}
private class SecondAdapter extends DefaultAdapter<Drawable>{
//构造函数,传递数据
public SecondAdapter(List<Drawable> datas){
super(datas);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SecondHolder holder;
if(convertView == null){
//创建一个Holder用于存放布局中的组件
holder = new SecondHolder();
//获取到view对象
holder.getContentView();
}else{
//获取到组件
holder = (SecondHolder) convertView.getTag();
}
//获取位置组件
Drawable drawable = datas.get(position);
holder.refreshView(drawable);
return holder.getContentView();
}
}
class SecondHolder{
ImageView iv;
private View view;
//构造方法,new SecondHolder()调用
public SecondHolder(){
view = View.inflate(getApplicationContext(), R.layout.item_second, null);
this.iv = (ImageView) view.findViewById(R.id.iv);
//把组件设置到holder中
view.setTag(this);
}
//获取到view
public View getContentView() {
return view;
}
public void refreshView(Drawable drawable){
//设置组件
iv.setImageDrawable(drawable);
}
}
}
第三步,holder中很多元素类似,合并holder中的内容,也使用了泛型来获取数据
BaseHolder.java
package com.example.listviewyouhua;
import android.view.View;
public abstract class BaseHolder<T> {
protected T data;
protected View contentView;
//构造方法,初始化View对象
public BaseHolder(){
contentView = initView();
contentView.setTag(this); // 在这个位置设置的标签
}
/**
* 当Holder中的view对象显示到界面上的时候调用
*/
public View getContentView() {
return contentView;
}
/**
/**
* 该方法 根据数据 显示界面
*/
protected abstract void refreshView(T data);
/**
* 初始化View对象 及其控件inflate方法
*/
protected abstract View initView();
}
MainActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
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 Activity {
private ListView lv;//lv是布局中的组件
private List<String> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化填充的数据有100条
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("qqqqqqqqaa"+i);
}
lv=(ListView) findViewById(R.id.lv);
//需要传递数据,用构造函数初始化
lv.setAdapter(new MainAdapter(datas));
}
//按钮点击事件,用来跳转到第二个Activity
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
private class MainAdapter extends DefaultAdapter<String>{
//构造函数,传递数据
public MainAdapter(List<String> datas){
super(datas);
}
//ConvertVierw是移动出屏幕的View对象,可以用来复用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MainHolder holder;
//组件没有就创建
if(convertView == null){
//创建一个Holder用于存放布局中的组件
holder = new MainHolder();
//获取到view对象
holder.getContentView();
}else{
//获取到组件
holder = (MainHolder) convertView.getTag();
}
//获取位置组件
String string = datas.get(position);
//设置布局
holder.refreshView(string);
return holder.getContentView();
}
class MainHolder extends BaseHolder<String>{
TextView tv;
//更新界面
public void refreshView(String string){
//设置组件
this.tv.setText(string);
}
//初始化数据
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv = (TextView) view.findViewById(R.id.tv);
return view;
}
}
}
}
SecondActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class SecondActivity extends Activity{
private ListView lv_second;//lsitview,lv_second是布局中的组件
private List<Drawable> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
//初始化填充的数据有100条,填充的是图片
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
}
//需要传递数据,用构造函数初始化
lv_second.setAdapter(new SecondAdapter(datas));
}
private class SecondAdapter extends DefaultAdapter<Drawable>{
//构造函数,传递数据
public SecondAdapter(List<Drawable> datas){
super(datas);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SecondHolder holder;
if(convertView == null){
//创建一个Holder用于存放布局中的组件
holder = new SecondHolder();
//获取到view对象
holder.getContentView();
}else{
//获取到组件
holder = (SecondHolder) convertView.getTag();
}
//获取位置组件
Drawable drawable = datas.get(position);
holder.refreshView(drawable);
return holder.getContentView();
}
}
class SecondHolder extends BaseHolder<Drawable>{
ImageView iv;
//更新界面
public void refreshView(Drawable drawable){
//设置组件
iv.setImageDrawable(drawable);
}
//初始化数据
@Override
protected View initView() {
View view = View.inflate(getApplicationContext(), R.layout.item_second, null);
this.iv = (ImageView) view.findViewById(R.id.iv);
return view;
}
}
}
第三步:抽取getView中的实现,这个里面需要获取到holder,因为不同的类型不同的holder,同时,传递的数据也是不同的,因此将Holder修改成BaseHolder,并使用泛型。
创建一个方法getHolder来获取不同的holder,并使用abstract,让子类自己实现getHolder来传递holder.
DefaultAdapter.java
package com.example.listviewyouhua;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
//使用泛型来实现
public abstract class DefaultAdapter<T> extends BaseAdapter{
//不确定类型,使用泛型
private List<T> datas;
//构造方法来获取到下面传递上来的参数
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建BaseHodler的holder,使用泛型
BaseHolder<T> holder;
if(convertView==null){
holder=getHolder();
}else{
holder=(BaseHolder<T>)convertView.getTag();
}
T string = datas.get(position);
//holder.refreshView(string);
holder.refreshView(string);
return holder.getContentView();
}
protected abstract BaseHolder<T> getHolder();
}
MainActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
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 Activity {
private ListView lv;//lv是布局中的组件
private List<String> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化填充的数据有100条
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("qqqqqqqqaa"+i);
}
lv=(ListView) findViewById(R.id.lv);
//需要传递数据,用构造函数初始化
lv.setAdapter(new MainAdapter(datas));
}
//按钮点击事件,用来跳转到第二个Activity
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
private class MainAdapter extends DefaultAdapter<String>{
//构造函数,传递数据
public MainAdapter(List<String> datas){
super(datas);
}
@Override
protected BaseHolder<String> getHolder() {
// TODO Auto-generated method stub
return new MainHolder();
}
}
class MainHolder extends BaseHolder<String>{
TextView tv;
//更新界面
public void refreshView(String string){
//设置组件
this.tv.setText(string);
}
//初始化数据
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv = (TextView) view.findViewById(R.id.tv);
return view;
}
}
}
SecondActivity.java
package com.example.listviewyouhua;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class SecondActivity extends Activity{
private ListView lv_second;//lsitview,lv_second是布局中的组件
private List<Drawable> datas;//初始化的数据用于填充布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
//初始化填充的数据有100条,填充的是图片
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
}
//需要传递数据,用构造函数初始化
lv_second.setAdapter(new SecondAdapter(datas));
}
private class SecondAdapter extends DefaultAdapter<Drawable>{
//构造函数,传递数据
public SecondAdapter(List<Drawable> datas){
super(datas);
}
@Override
protected BaseHolder<Drawable> getHolder() {
// TODO Auto-generated method stub
return new SecondHolder();
}
}
class SecondHolder extends BaseHolder<Drawable>{
ImageView iv;
//更新界面
public void refreshView(Drawable drawable){
//设置组件
iv.setImageDrawable(drawable);
}
//初始化数据
@Override
protected View initView() {
View view = View.inflate(getApplicationContext(), R.layout.item_second, null);
this.iv = (ImageView) view.findViewById(R.id.iv);
return view;
}
}
}