到公司也已經幾個月了一直在寫項目,拿着同事的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;
}
}
續寫。。。。。。。。。。。。。。。。public int getItemViewType(int position) {
// TODO Auto-generated method stub
return super.getItemViewType(position);
} 根據position獲取type類型
public int getViewTypeCount() {
// TODO Auto-generated method stub
return super.getViewTypeCount();
}
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;
}
}