Adapter之自定义Adapter


前言:

在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器

正文:

因为我们用到的ListView视图所以我们先初始化ListView,在我们的主活动中添加如下代码

1 <ListView
2         android:id="@+id/lv"
3         android:layout_width="wrap_content"
4         android:layout_height="wrap_content"
5         />

下面直接来Java代码

 1 package com.example.administrator.testmyadapter;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import android.widget.BaseAdapter;
 9 import android.widget.ListView;
10 import android.widget.TextView;
11 
12 import java.util.ArrayList;
13 import java.util.List;
14 
15 public class MainActivity extends AppCompatActivity {
16     private ListView lv; 17     private List<String>list; 18     private MyAdapter myAdapter;
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23         lv=(ListView)findViewById(R.id.lv); 24         list=new ArrayList<String>(); 25         for (int i=0;i<=40;i++){ 26             list.add("数据"+i); 27  } 28         myAdapter=new MyAdapter();
29         lv.setAdapter(myAdapter);
30     }
31     class MyAdapter extends BaseAdapter{
32         @Override
33         //item的数量
34         public int getCount() {
35             return list.size();
36         }
37 
38         @Override
39         //item对象
40         public Object getItem(int position) {
41             return list.get(position);
42         }
43 
44         @Override
45         //item对象的id
46         public long getItemId(int position) {
47             return position;
48         }
49 
50         @Override
51         //获取每一个item的view视图
52         public View getView(int position, View convertView, ViewGroup parent) {
53             //获取布局映射器对象
54             LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
55             //将XML文件映射为view对象
56             View view=inflater.inflate(R.layout.my_item_activity,null);
57             //通过view对象找到控件
58             TextView textView=(TextView)view.findViewById(R.id.textview);
59             //赋值
60             textView.setText(list.get(position));
61             return view;
62         }
63     }
64 }

步骤二:

初始化ListView:黄色部分都是初始化ListView

步骤三:

初始化数据源:浅青色都是初始化数据源,常规操作不需要讲解

步骤四:

自定义适配器:1.添加名为MyAdapter的内部类 并且要继承BaseAdapter重写四个方法getCount(获取item数量)getItem(获取item对象)

        getItemId(获取Item对象id)getView(获取每一个item的view视图)

       2.通过LayoutInflater调用from方法获取布局映射器对象

       3.通过布局映射器对象调用inflate方法,使将XML文件映射为view对象

       4.通过view对象找到控件

       5.对找到的控件对象调用setText进行赋值

       6.返回view

问题:

上面写的内容在每次划出新的item时会再次实例化对象,这样就会耗费大量的时间

这一次我们使用convertView,这样我们在滑到哟个新的item时会把之前滑出屏幕的item进行复用

来代码:

 1 public View getView(int position, View convertView, ViewGroup parent) {
 2             Holder holder;
 3             if(convertView==null){
 4                 convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.my_item_activity,null);  5                 holder=new Holder();
 6                 holder.tv=(TextView)convertView.findViewById(R.id.textview);
 7                 //打标签
 8                 convertView.setTag(holder);
 9             }else {
10                 //进行复用
11                 holder=(Holder)convertView.getTag();
12             }
13             holder.tv.setText(list.get(position));
14             return convertView;
15         }
16         class Holder{
17             TextView tv;
18         }

在这些代码中仍然是在getView方法中进行操作,并再次添加一个内部类Holder,并且类中添加复用的控件

在getView方法中首先是一个判断,if是在第一次进入程序中创建的,而且如果屏幕中显示n个item则创建n+1个

第四行代码是通过布局映射器把XML文件映射为convertView对象,然后让复用标签和给定标签进行关联

打标签就是为了让方便取出convertView中需要赋值的控件

在else中getTag课取出打进去的标签

getView返回值是convertView

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM