Listview学习(一)

来源:互联网 发布:信盈达 知乎 编辑:程序博客网 时间:2024/05/17 05:56

Listview学习(一)

Listview是安卓中非常常用的控件。下边是一些学习过程中的总结。
使用方法:
1.加载数据,数据类型可以是list,map,set等基本类型的相关类。
2.新建adapter,adapter比较常用的是arrayadapter,或者是复写baseadapter的getview方法得到的自定义adapter。
3.将adapter绑定到listview上
一个简单的示例如下:

package com.bupt.markfavor.demo0910listview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends AppCompatActivity {    private ListView listView;    private ArrayAdapter adapter;    public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",    "blackberry","cherry","coconut","cumquat","fig","fresh"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//        1.普通listview        listView = (ListView) findViewById(R.id.listview);        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);        listView.setAdapte`````````(adapter);    }}

这个例子看起来并不复杂,但是在实际使用当中却有很多问题。当listview当中的item数量过多时,过快滑动条目会产生明显的卡顿现象。这是因为listview的每一个条目在使用过程中会不断地调用adapter里getview来获取新的内容,当条目数量过多滑动速度过快时,会重复加载新的view对象,不管该对象之前是否被加载过。因此,在实际使用中更多的时候是自定义adapter,在getview方法中定义viewholder,缓存已经出现过的条目,再利用convertview来进行判断该条目是否出现过,是否可以加载缓存。这样可以提升listview的效率。代码如下:


public class MainActivity extends AppCompatActivity {    private ListView listView;    private ArrayAdapter adapter;    public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",    "blackberry","cherry","coconut","cumquat","fig","fresh"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);////        1.普通listview//        listView = (ListView) findViewById(R.id.listview);//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);//        listView.setAdapter(adapter);        //2.自定义adapter的listview,提升运行效率        listView=(ListView)findViewById(R.id.listview);        MyAdapter myAdapter = new MyAdapter(this);        for (int i =0;i<=50;i++){            myAdapter.addItem("item"+i);        }        listView.setAdapter(myAdapter);    }}

下面是自定义adapter,实现了检查convertview是否有缓存,用viewholder装载布局文件。

package com.bupt.markfavor.demo0910listview;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.ArrayList;import static android.content.ContentValues.TAG;/** * Created by markfavor on 2017/9/13. */public class MyAdapter extends BaseAdapter {    private ArrayList<String>myData = new ArrayList<>();    private LayoutInflater myInflater;    public MyAdapter(Context context) {        super();        myInflater=LayoutInflater.from(context);//        myInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);效果与上句相同    }    public void addItem(String a){        myData.add(a);        notifyDataSetChanged();//通知所有与已经改变数据相关联的观测者应当刷新数据    }    @Override    public int getCount() {        return myData.size();    }    @Override    public Object getItem(int position) {        return myData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder = null;        Log.d(TAG, "getView: "+position+","+convertView);        if (convertView==null){            holder=new ViewHolder();            convertView=myInflater.inflate(R.layout.item1,null);            holder.textview= (TextView) convertView.findViewById(R.id.text);            convertView.setTag(holder);        }else {            holder= (ViewHolder) convertView.getTag();        }        holder.textview.setText(myData.get(position));        return convertView;    }    public static class ViewHolder{        public TextView textview;    }}

item1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical">    <TextView        android:id="@+id/text"        android:layout_width="wrap_content"        android:layout_height="50dp"        android:gravity="center_vertical"        android:text="text" /></LinearLayout>
原创粉丝点击