您的位置:首页 > 其它

ListView-BaseAdapter

2016-04-21 01:12 489 查看
1、 首先需要有两个布局文件,一个是主布局,用来放ListView,另一个用来作为ListView的Item中的布局。

vitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/imageView" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView"
android:paddingTop="20dp"
android:paddingLeft="20dp"/>
</LinearLayout>


2、新建一个类MyClass来存放vitem布局里每个组件的内容

public class MyClass {
String text;
int image;
public MyClass(String text,int image){
this.text=text;
this.image=image;
}
}


3、在活动中把每个item中组件的内容存入一个List中,类型为MyClass

MainActivity

public class MainActivity extends Activity {
MyClass myClass;
ListView listView;

List<MyClass> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.listView);
list=new ArrayList<>();
//这里通过循环创建MyClass对象,每个对象存放每个item中组件内容,并添加到一个List中,注:这里我的每个item内容都是相同
for(int i=0;i<10;i++){
myClass=new MyClass("text",R.drawable.youtube);
list.add(myClass);
}

listView.setAdapter(new MyAdapter(MainActivity.this,list));

}
}


4.、新建一个类继承BaseAdapter,并重写里面的getCount、getItem、getItemId、getView方法

public class MyAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<MyClass> list;

public MyAdapter(Context context2,List<MyClass> list2){
inflater=LayoutInflater.from(context2);
this.list=list2;
};
@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//首先使用找到context加载其中的item的布局,获得一个View对象
View view=inflater.inflate(R.layout.vitem,null);
//获得item布局的View对象后就可以找到其中的组件
ImageView image=(ImageView)view.findViewById(R.id.imageView);
TextView text=(TextView)view.findViewById(R.id.textView);
//ListView中存放了MyClass类实例,MyClass类实例中又有存放ImageView的id的变量和存放要付给TextView的字符串,position是一个下标
MyClass myClass=list.get(position);
//设置组件
image.setImageResource(myClass.image);
text.setText(myClass.text);
return view;
}
}


上面的getView方法是效率最低的写法,getView还可以进行优化。

主要是对LayoutInflater.form(context).inflate(R.layout.item)

和findViewById的优化,第一次加载后存放到一个对象中,第二次直接使用该对象中存放的内容。

public view getView(int position,View convertView,ViewGroup parent){
View view;
ViewHolder viewHolder;
MyClass myClass=list.get(position);
//判断convertView是否为空,当布局第一次加载时为空
if(convertView==null){
view=inflater.inflate(R.layout.vitem,null);
viewHolder=new viewHolder();
//第一次加载时把组件存放到ViewHolder中
viewHolder.imageView=(ImageView)findViewById(R.id.imageView);
viewHolder.textView=(TextView)findViewById(R.id.textView);
view.setTag(viewHolder);
}else{
view=convertView;
viewHolder=(ViewHolder)view.getTag();
}
viewHolder.imageView.setImageResource(myClass.image);
viewHolder.textView.setText(myClass.text);
return view;
}
Class ViewHolder(){
ImageView imageView;
TextView textView;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: