2.将list保存到ViewHolder对象中
缺陷:
当我们的ListView中填充的item有多种形式时,比如微博中,有的item中包含图片,有的item包含视频,那么必然的,我们需要用到2种item的布局方式,此时如果只是单纯判断convert是否存在,会造成回收的view不符合你当前需要的布局,而类似转换失败出错退出
这里要提到Adapter中的另外2个方法:
public int getItemViewType(int position) {}
public int getViewTypeCount() {}
MainActivity.java
-
package cn.com.xiebiao.listview;
-
import android.app.Activity;
-
import android.content.Context;
-
import android.os.Bundle;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
import android.widget.ArrayAdapter;
-
import android.widget.BaseAdapter;
-
import android.widget.Button;
-
import android.widget.ListView;
-
import android.widget.TextView;
-
import android.widget.Toast;
-
-
import java.util.ArrayList;
-
import java.util.List;
-
-
-
public class MainActivity extends Activity {
-
private ListView listView;
-
private ArrayAdapter<String> adapter;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
listView=(ListView)this.findViewById(R.id.listView);
-
MyAdapter myAdapter=new MyAdapter(this);
-
listView.setAdapter(myAdapter);
-
-
}
-
-
class MyAdapter extends BaseAdapter{
-
private ViewHolder viewHolder;
-
private List<String> list;
-
private LayoutInflater layoutInflater;
-
-
MyAdapter(Context context){
-
this.list=getResource();
-
//获取context的布局填充器
-
this.layoutInflater=LayoutInflater.from(context);
-
}
-
-
@Override
-
public int getCount() {
-
System.out.println("--->>getCount中size="+list.size());
-
return list.size();
-
}
-
-
@Override
-
public Object getItem(int i) {
-
System.out.println("--->>getItem中i="+i);
-
return i;
-
}
-
-
@Override
-
public long getItemId(int i) {
-
System.out.println("--->>getItemID中i="+i);
-
return i;
-
}
-
-
@Override
-
public View getView(final int i, View view, ViewGroup viewGroup) {
-
System.out.println("--->>getView中i="+i);
-
-
//优化一:判断view是否已经绘制,已经绘制的话就不用重性绘制,关键的优化
-
//优化二:通过ViewHolder对象,可以省去已绘制对象findViewById()的系统资源消耗
-
if(view==null){
-
view=layoutInflater.inflate(R.layout.list,null);
-
viewHolder=new ViewHolder();
-
viewHolder.textView=(TextView)view.findViewById(R.id.textView);
-
viewHolder.button=(Button)view.findViewById(R.id.button);
-
view.setTag(viewHolder);//保存ViewHolder对象
-
}else {
-
viewHolder=(ViewHolder)view.getTag();//取出ViewHolder对象
-
}
-
-
viewHolder.textView.setText(list.get(i));
-
viewHolder.button.setText("Button"+i);
-
-
//为button添加点击事件
-
viewHolder.button.setOnClickListener(new View.OnClickListener() {
-
@Override
-
public void onClick(View view) {
-
Toast.makeText(MainActivity.this,"第"+i+"个button",Toast.LENGTH_SHORT).show();
-
}
-
});
-
-
return view;
-
}
-
}
-
-
//获取资源
-
public List<String> getResource(){
-
List<String> list=new ArrayList<String>();
-
for(int i=0;i<30;i++){
-
list.add("xiebiao "+i);
-
}
-
return list;
-
}
-
-
//用户持有list内部控件的类
-
public final class ViewHolder{
-
public TextView textView;
-
public Button button;
-
}
- }
list.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android=""
-
android:layout_width="match_parent" android:layout_height="wrap_content">
-
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:text="New Text"
-
android:textSize="30sp"
-
android:id="@+id/textView" />
-
-
<Button
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:text="New Button"
-
android:textSize="30sp"
-
android:id="@+id/button" />
-
- </LinearLayout>
activity_main.xml
-
<RelativeLayout xmlns:android=""
-
xmlns:tools="" android:layout_width="match_parent"
-
android:layout_height="match_parent">
-
-
<ListView
-
android:layout_width="wrap_content"
-
android:layout_height="match_parent"
-
android:id="@+id/listView"
-
android:layout_alignParentTop="true"
-
android:layout_centerHorizontal="true"/>
- </RelativeLayout>