到公司也已经几个月了一直在写项目,拿着同事的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类型
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();
}
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;
}
}