ListView之BaseAdapter

来源:互联网 发布:淘宝药房旗舰店 编辑:程序博客网 时间:2024/05/22 12:48

直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,因为这会涉及到ListView优化等问题。

第一种没有任何处理,数据少量的时候可以,如果数据量大了就会出现卡

public class MyAdapterNormal extends BaseAdapter {    private LayoutInflater mInflater = null;    private Context context;    private List<Map<String,Object>> data;    public MyAdapterNormal(Context context, List<Map<String,Object>> data)    {        this.context = context;        this.mInflater = LayoutInflater.from(context);        this.data = data;    }    @Override    public int getCount() {        //适配器中所代表的数据集中的条目数        return data.size();    }    @Override    public Object getItem(int i) {        //获取数据集中与制定索引对应的数据项        return i;    }    @Override    public long getItemId(int i) {        //列表中指定索引对应的行id        return i;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        view = mInflater.inflate(R.layout.list_item,null);        ImageView img = (ImageView)view.findViewById(R.id.img);        TextView title = (TextView)view.findViewById(R.id.title);        TextView info = (TextView)view.findViewById(R.id.info);        img.setImageResource(R.drawable.call);//control+c和control+v添加图片        title.setText((String)data.get(i).get("title"));        info.setText((String)data.get(i).get("info"));        return view;    }}
//--------------------------------------------------note

LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
LayoutInflater 是一个抽象类,在文档中如下声明:
public abstract class LayoutInflater extends Object
获得 LayoutInflater 实例的三种方式
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 
2. LayoutInflater inflater = LayoutInflater.from(context);  
3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService
                              (Context.LAYOUT_INFLATER_SERVICE);

//----------------------------------------------

第二种,ListView优化:通过缓存view,这种利用缓存view的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

public View getView(int i, View view, ViewGroup viewGroup) {    if (view == null){        view = mInflater.inflate(R.layout.list_item,null);    }    ImageView img = (ImageView)view.findViewById(R.id.img);    TextView title = (TextView)view.findViewById(R.id.title);    TextView info = (TextView)view.findViewById(R.id.info);    img.setImageResource(R.drawable.call);    title.setText((String)data.get(i).get("title"));    info.setText((String)data.get(i).get("info"));    return view;}
第三种,ListView优化:通过缓存view+viewHolder来实现,viewHolder就是一个静态类,使用viewHolder的关键好处是缓存了显示数据的视图(view),加快了UI的响应速度当我们判断view == null 的时候,如果为空,就会根据设计好的ListItem布局(XML),来为view赋值,并生成一个viewHolder来绑定view里面的各个View控件(XML布局里面的那些控件)。再用viewsetTagviewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出如果view不为空的时候,就会直接用viewgetTag(),来获得一个ViewHolder

@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {    ViewHolder holder;    if (view == null){        holder = new ViewHolder();        view = mInflater.inflate(R.layout.list_item,null);        holder.img = (ImageView)view.findViewById(R.id.img);        holder.title = (TextView)view.findViewById(R.id.title);        holder.info = (TextView)view.findViewById(R.id.info);        view.setTag(holder);    }else {        holder = (ViewHolder)view.getTag();    }    holder.img.setImageResource(R.drawable.call);    holder.title.setText((String)data.get(i).get("title"));    holder.info.setText((String)data.get(i).get("info"));    return view;}static  class  ViewHolder{  public ImageView img;    public  TextView title;    public TextView info;}
//--------------note

ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们

要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById())

public class MainActivity extends AppCompatActivity {    private ListView lv;    private List<Map<String,Object>> data;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView)findViewById(R.id.listV);        data = getData();        MyAdapterNormal adapter = new MyAdapterNormal(this,data);        lv.setAdapter(adapter);    }    private List<Map<String,Object>> getData(){        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();        Map<String,Object> map;        for (int  i = 0;i < 20;i++){            map = new HashMap<String, Object>();            map.put("img", R.drawable.call);            map.put("title", "跆拳道");            map.put("info", "快乐源于生活...");            list.add(map);        }        return list;    }}
//-----------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?><RelativeLayout 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"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.888.myapplication0.MainActivity"><ListView    android:id="@+id/listV"    android:layout_width="match_parent"    android:layout_height="match_parent"></ListView></RelativeLayout>
//-----------------------------------------------------------------------------------------

<?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="wrap_content"><ImageView    android:id="@+id/img"    android:layout_width="50dp"    android:layout_height="50dp" /><LinearLayout    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical">    <TextView        android:id="@+id/title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="18sp"/>    <TextView        android:id="@+id/info"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="14sp"/></LinearLayout></LinearLayout>

0 0
原创粉丝点击