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