自定义ListView的使用及忧化
什么是ListView:翻译是列表视图,我们的QQ好友列表,今日头条的一条条新闻就是ListView。
适配器:因为安卓APP开发框架本身就是MVC模式,所以为了将视图层和控制层关联起来,采用适配器机制来进行联系,适配器也是一种设计模式,通俗来讲可比作,我们的手机充电头,我们的手机需要5V直流,但电网是220V交流,所以充电头就起到一个转换的作用,将两者桥接起来。因为是自定义的ListView,所以适配器也要自定义,这里我们继承ArrayAdapter。
ListView布局及其子布局:一般ListView占屏幕的很大部分,子布局的意思是ListView的每一项布局是怎么样的。ListView包含很多子布局。
数据源:ListView中要加载很多数据,所以为了方便,我们新建了一个类来提供数据源。
所以自定义ListView的编码过程可按如下方式:
1、activity_main.xml放置一个ListView
2、编写子布局
3、编写数据源类,初始化数据
4、装备适配器,将数据放进适配器中,关联子项布局
5、将适配器与ListView关联。、
第一步:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"
></ListView>
</LinearLayout>
第二步:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView//子项布局,显示一行文字,
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="ooooooooo"
android:id="@+id/fruit_name" />
</LinearLayout>
第三步:
public class fruit{//数据源类
private String fruit_name;
public fruit(String name){
this.fruit_name=name;
}
public String getname(){
return fruit_name;
}
第四步:
public class fruitadapter extends ArrayAdapter<fruit>{
private int ID;
public fruitadapter(Context context, int textViewResourceId, List<fruit> objects){
super(context,textViewResourceId,objects);
ID=textViewResourceId;//存储textViewResourceId
}
@Override
public View getView(int position, View convertView, ViewGroup parent){//每一项子项调用的时候自动调用,convertView用作缓存忧化。
fruit ft = getItem(position);
View view;
ViewHolder viewHolder;
if(convertView != null) {
view=convertView;
viewHolder = (ViewHolder)view.getTag();
}
else
{
view = LayoutInflater.from(getContext()).inflate(ID, null);
viewHolder = new ViewHolder();
viewHolder.textViewname=(TextView)view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}
viewHolder.textViewname.setText(ft.getname());
return view;
}
class ViewHolder{//不必每必获取控件的实例。
TextView textViewname;
}
}
第五步:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 100; i++) {//初始化数据
fruitlist.add(new fruit("oooooooooo"));
}
fruitadapter adpter = new fruitadapter(MainActivity.this, R.layout.fruit_item, fruitlist);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adpter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//设置子项监听
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
fruit f = fruitlist.get(position);
Toast.makeText(MainActivity.this, f.getname() + " " + position, Toast.LENGTH_SHORT).show();
}
});
}