ListView-BaseAdapter

来源:互联网 发布:淘宝睡衣女装 编辑:程序博客网 时间:2024/05/18 03:06

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;}
0 0
原创粉丝点击