Listview和 Adapter


到公司也已经几个月了一直在写项目,拿着同事的Demo 通过打log 一点一点的写。log测试发现通过 OK,接着打下一个log

日子就这样反复过了4个月。项目也写的差不多了,却悲剧的发现自己能写点东西,也能该点东西,可是没Demo让自己去写,就会显得无从下手。

所以写文章开始总结知识点,当然这里很多是在百度上百度的,然后通过自己写,运行,总结写进来的。供自己以后回顾,如果你看到这篇文章有不懂的地方欢迎留言,大家一起探讨。也许你的问题我并不能给你满意的答案。

 ListView 和Adapter
工作原理:(1)ListView 针对List中的每一个item,要求adapter“给我一个视图”(getview)

                    (2)getView 返回视图

   

package bsn.cc.dd;

import java.util.ArrayList;

import android.R.integer;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class ListView extends ListActivity{
	private MyAdapter adapter;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		adapter=new MyAdapter();
		for (int i = 0; i < 40; i++) {
			adapter.addItem("item"+i);
		}
		setListAdapter(adapter);
	}

 private class MyAdapter extends BaseAdapter{

	 private LayoutInflater mInflater;
	 private ArrayList<String> mData=new ArrayList<String>();
	
	 public MyAdapter() {
		 super();
		 System.out.println("----------------------");
		
     mInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
//此方法通过activity给view的item添加值。通过notifyDataSetChanged 刷新界面
     public  void addItem(final String item){
	   mData.add(item);
	   notifyDataSetChanged();
   }
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mData.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		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) {
		// TODO Auto-generated method stub
		System.out.println("getview--------"+position+"--convertView--"+convertView);
		ViewHolder holder=null;
//这里ConvertView是Android为了优化ListView提供给我们View的缓存。当Listview加载的时候androilistview加载前10个item。随后用缓存记住view。下次加载item时候直接读取前10个ConvertView
		if (convertView==null) {
                    //加载前10个数据的时候用convertView获取layout
			convertView=mInflater.inflate(R.layout.adapter, null);
			holder=new ViewHolder();
                   //通过convertView为静态类中的textView设置值
			holder.textView=(TextView) convertView.findViewById(R.id.adapter_text);
			convertView.setTag(holder);
                  // tag记住你现在用的是那个静态类  但是没搞懂为什么View的setTag中可以放入静态类holder
		}else {
                  //convertView不为空的时候取到tag
			holder=(ViewHolder) convertView.getTag();
		}
		holder.textView.setText(mData.get(position));
		
		return convertView;
	}
	 
 }
//此静态类中用来定义了getView中准备显示内容的控件。
 private static class ViewHolder{
	 private TextView textView;
 }
 
}
续写。。。。。。。。。。。。。。。。
如果要实现复杂一点的adapter需要重写baseadapter的2个方法。
(1)
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return super.getItemViewType(position);
} 根据position获取type类型
(2)@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return super.getViewTypeCount();
}
 type的个数

package bsn.cc.dd;

import java.util.ArrayList;
import java.util.TreeSet;

import android.R.integer;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListView extends ListActivity {
	private MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		adapter = new MyAdapter();
		for (int i = 0; i < 40; i++) {
			adapter.addItem("item" + i);
			if (i!=0&&i%4==0) {
				adapter.addSplit("split-"+i);
			}
		}
		setListAdapter(adapter);
	}

	private class MyAdapter extends BaseAdapter {

		private LayoutInflater mInflater;
		private static final int TYPE_ITEM=0;
		private  static final int TYPEI_SPLIT=1;
		private static final int TYPEMAX_COUNT=TYPEI_SPLIT+1;
		private TreeSet treeSet=new TreeSet();
		private ArrayList<String> mData = new ArrayList<String>();

		public MyAdapter() {
			super();
			System.out.println("----------------------");

			mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		public void addItem(final String item) {
			//将item加入arraylist中
			mData.add(item);
			notifyDataSetChanged();
		}
        public void addSplit(final String item){
        	//用treeset来保存split的位置
        	mData.add(item);
        	treeSet.add(mData.size()-1);
        	notifyDataSetChanged();
        }
        
        
		@Override
		public int getItemViewType(int position) {
			//在getview中调用通过资源的位置来确定layout。这里用treeset来控制posotion的为位置
			// TODO Auto-generated method stub
			return treeSet.contains(position)?TYPEI_SPLIT:TYPE_ITEM;
		}

		@Override
		public int getViewTypeCount() {
			// TODO Auto-generated method stub
			return TYPEMAX_COUNT;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mData.size();
		}

	

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			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) {
			// TODO Auto-generated method stub
			System.out.println("getview--------" + position + "--convertView--"
					+ convertView);
			ViewHolder holder = null;
			//根据position来获取type,然后根据type来确定我们的adapter
			int type=getItemViewType(position);
			if (convertView == null) {
				holder = new ViewHolder();
				switch (type) {
				case TYPE_ITEM:
					convertView = mInflater.inflate(R.layout.adapter, null);
					
					holder.textView = (TextView) convertView
							.findViewById(R.id.adapter_text);
					convertView.setTag(holder);
					break;

				case TYPEI_SPLIT:
               convertView = mInflater.inflate(R.layout.adapter2, null);
					
					holder.textView = (TextView) convertView
							.findViewById(R.id.adapter_text);
					convertView.setTag(holder);
					break;
				}
				
			} else {
				holder = (ViewHolder) convertView.getTag();
				System.out.println("------------holder-----tag---"+convertView.getTag());
				System.out.println("------------holder-----是什么??"+holder);
			}
			holder.textView.setText(mData.get(position));

			return convertView;
		}

	}

	private static class ViewHolder {
		private TextView textView;
	}

}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值