Android适配器的用法

Android适配器

Adapter是适配器,适配器是用来连接两个不相干的事物的桥梁。在我们今天的课程中,适配器是用来连接我们的AdapterView和数据。


AdapterView中我们常用的有:ListView(列表控件),GridView(网络控件),Gallery(画廊);

ListView 列表控件,实现一个数据列表,能方便让我们修改数据,并同时影响界面。
android: id="@+id/listView"
android: layout_width="match_parent"
android: layout_height="match_parent"
android: entries="@array/Cities"
/>

使用适配器的方式显示ListView:
1.在布局文件中,定义一个简单的ListView标签。
2.在Activity中实现一个我们自己扩展的BaseAdapter子类对象。
3.通过findViewById在Activity中找到布局文件中的ListView对象。
4.将适配器对象设置给我们的ListView对象。

ListView他不只是一个View,还是一个ViewGroup(容器控件)。从字面意思很好理解,他是一个用于装载控件的容器。它本身并不用显示数据,而是用来装载显示数据的控件(TextView,Button,EditText...)的容器。


在现在看来,其实ListView虽然是控件,但是他们的作用更接近于我们的布局类型。不过,布局类型,能够直接在其中放置子控件。而ListView,只能通过适配器,加载他的子控件。

ListView动态内容的动态添加
1.由用户或服务器获取的数据,跟新我们的数据容器。
2.然后掉用Adapter.notifiDataSetChanged();来提醒ListView数据已经更新,界面需要刷新。
ListView性能优化:
在getView的参数列表中,提供给我们了一个convertView,这个视图对象能为我们提供一种性能优化的手段。


ListView性能优化有两种:






package com.feicui.test;

import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;


public class LayoutListViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//
final ArrayList list = new ArrayList();
// 添加数据
list.add("成都");
list.add("毛坝");
ArrayList     sginlist=new  ArrayList();
sginlist.add("还好好。");
sginlist.add("好棒好棒。");
//imageslist.add("");
super.onCreate(savedInstanceState);
//
setContentView(R.layout.listview_layout);
// 找到
final ListView listView = (ListView) findViewById(R.id.listView1);
final MyAdapter adapter = new MyAdapter(list,sginlist);
listView.setAdapter(adapter);
// 找到Edittext
final EditText edittext_1 = (EditText) findViewById(R.id.edittext_1);

edittext_1.setOnEditorActionListener(new OnEditorActionListener() {


@Override
public boolean onEditorAction(TextView view, int id, KeyEvent arg2) {

switch (id) {
case EditorInfo.IME_ACTION_DONE:// 改变
// 添加数据
list.add(view.getText().toString());
// 重新读取数据相当于刷新
adapter.notifyDataSetChanged();
// 清空
edittext_1.setText("");
return true;
}
return false;
}
});
}


// 创建一个Adapter类
class MyAdapter extends BaseAdapter {
//
ArrayList arraylist,sginlist;
//布局注入器
LayoutInflater    inflater;
public MyAdapter() {


}

public MyAdapter(ArrayList list,ArrayList sginlist) {
this.arraylist = list;
this.sginlist=sginlist;
inflater=LayoutListViewActivity.this.getLayoutInflater();
}

@Override
public int getCount() {


return arraylist.size();
}



@Override
public View getView(int position, View converView, ViewGroup arg2) {
/***********************************这是没有优化过的写法***************************************************/
// 创建一个Textview对象
TextView tv = new TextView(MainActivity.this);
// 显示类容
tv.setText(arraylist.get(arg0 % getCount()));
//这个inflate方法,将指定的布局文件变成视图对象(view)
LayoutInflater    inflater=MainActivity.this.getLayoutInflater();
//通过inflater找的布局文件XML文件变为视图
View   view=inflater.inflate(R.layout.itme_layout, null);
//找到textview
TextView   tv_name=(TextView)view.findViewById(R.id.tv_name);
//
TextView   tv_sgin=(TextView) view.findViewById(R.id.tv_sign);

TextView   images_1= (TextView) view.findViewById(R.id.image_1);

//tv_name.setText(arraylist.get(arg0%getCount()));
//tv_sgin.setText(sginlist.get(arg0%sginlist.size()));
/*****************************************这是第一种优化的方法**************************************************************/
//优化后(判断converView是否为空):
//复用ConverView,这个View对象中,装载着刚装载着刚刚退出屏幕的那个item的视图对象。我们新进入的item就可以复用这个对象
if(converView==null){
//如果convertView为空,就创建item视图
//使用布局注入器,布局注入器我们现在放在构造器中获取。这样就不用每次调用getView都获取一次了。
converView=inflater.inflate(R.layout.itme_layout, null);
//
TextView   tv_name=(TextView) converView.findViewById(R.id.tv_name);
tv_name.setText("今天你好。");
}else{
//如果converView不为空,就复用converView中携带的这个视图对象
TextView   tv_sgin=(TextView) converView.findViewById(R.id.tv_sign);
// tv_sgin.setText("今天是第"+position+"天。");
}

return converView;
/*********************************************这是第三种优化的方法*************************************************************************/
//优化2.是为了减少控件的调用
ViewHolder    viewHolder=null;
if(converView==null){
//使用布局注入器,布局注入器我们现在放在构造器中获取。这样就不用没次都去调用getView都获取一次了。
converView=inflater.inflate(R.layout.itme_layout, null);
//找到convertView中的子控件
TextView  tv_name=(TextView) converView.findViewById(R.id.tv_name);
//
TextView   tv_sgin=(TextView) converView.findViewById(R.id.tv_sign);
//创建ViewHolder
viewHolder = new ViewHolder();
viewHolder.tv_name=tv_name;
viewHolder.tv_sgin=tv_sgin;
//将TextView对象保存在convertView的tag中。
converView.setTag(viewHolder);
}

viewHolder =  (ViewHolder) converView.getTag();

viewHolder.tv_name.setText(arraylist.get(position%getCount()));
viewHolder.tv_sgin.setText(sginlist.get(position%sginlist.size()));
return    converView;
}



/*
*这是用于第三种优化的类
* 创建一个ViewHolder类
* */
class   ViewHolder{
TextView   tv_name;  //用户名字
TextView   tv_sgin; //个性签名
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}





































你可能感兴趣的:(Android适配器的用法)