206.m1-ListView的优化理解

创建两个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;
		}
		
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值