Adapter與ListView的簡單應用(下)

Android應用界面開發

第二章學習

第二部分####


1.繼續分析Adapter的常用類
上一篇文章使用了ArrayAdapte制作了一個只由簡單的文字組成的ListView,那ArrayAdapter是不是只有簡單顯示一行文字的功能呢?答案是否定的。

public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {...}

發現,既然ArrayAdapter是接受泛型的,那其實什么樣的類都能傳給它,并且它繼承自BaseAdapter,可使用的方法很多。

包含泛型List的構造方法:

 public ArrayAdapter(Context context, int resource, List<T> objects)

其它上一篇都說了,這次不使用數組,而使用一個泛型集合List< T > objects,并且去掉了一個構造參數int textViewResourceId (也就是textView的ID),這次不只針對單行的文本,所以只有這個參數不夠用呀,你當然也可以填滿4個參數,默認值就為0,表示無。

ListView01

自己思考后,畫了2張圖,原創的!

其實,在數據源中每一個object(包含各種Java類),在ListView中對應著每一個item(列表中的每一個橫行)

ListView02

而Java類中的對應的變量,則可以一 一對應與item布局文件中的各個屬性。
來,編代碼,存在一個Data類,表示每一個Item包含的內容。

public class Data {
 private String Text; //需要顯示的文字
 private int ImageId; //需要顯示的圖片資源編號

 public Data(String text, int imageId) {
 Text = text;
 ImageId = imageId;
 }
 public String getText() {
 return Text;
 }
 public int getImageId() {
 return ImageId;
 }
}

接下來需要編寫一個自定義ArrayAdapter< Data >類,用于處理Data變量與控件屬性的關系。

public class DataAdapter extends ArrayAdapter<Data> {
 int mResourceId;

 public DataAdapter(Context context, int resource, List<Data> objects) {
 super(context, resource, objects); //調用ArrayAdapter的構造方法
 mResourceId = resource; //獲取list的布局文件
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 //重寫getView方法
 Data mData = getItem(position);
 //獲取此Data
 ViewHolder mViewHolder;
 if (convertView == null){
 //如果view未被創建過,且緩存為空
 mViewHolder = new ViewHolder();
 convertView= LayoutInflater.from(getContext()).inflate(mResourceId,null);
 //此時,將mResourceId轉換成了View類
 /*其實LayoutInflater.from(Context context)方法,就是包含下列參數的靜態方法
 /LayoutInflater LayoutInflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 獲得了系統的布局解析服務*/
 //inflate的第一個參數是布局文件Id,第二個ViewGroup對象,在創建單獨的view的時候,只需要填null

 mViewHolder.textView = (TextView)convertView.findViewById(R.id.textView);
 mViewHolder.image = (ImageView) convertView.findViewById(R.id.image);
 //通過convertView找到其中的控件

 convertView.setTag(mViewHolder);
 //將ViewHolder類存儲到已經實例化的convertView中
 }else {
 //如果convertView有值
 mViewHolder = (ViewHolder) convertView.getTag();
 //從convertView中拿到ViewHolder類,從而可以使用其中的對象
 }
 mViewHolder.textView.setText(mData.getText());
 mViewHolder.image.setImageResource(mData.getImageId());
 //通過實例化后的Data數據,獲取相應函數,進行屬性的賦值

 return convertView;
 }
 class ViewHolder{
 //創建一個類,用于保存實例化的對象

 TextView textView;
 ImageView image;
 }
}

其中position是item的順序編號,此編號與List< Data>中的Data位置相同

其它不難理解,在其中創建了一個內部類ViewHolder,因為調用getview方法時,不需要每次都創建textView等屬性的實例,只需要第一次創建時,將實例創建在ViewHolder內部;利用View的setTag方法,可將一些類型的實例存儲于其中,并隨著view的傳遞而傳遞,在需要使用是,利用getTag方法取出。

貼上剩下的代碼
Class FirstAty

public class FirstAty extends AppCompatActivity {

 private ArrayList<Data> mList;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_first_aty);

 initData();
 //初始化數據

 DataAdapter DataAdapter = new DataAdapter(FirstAty.this,R.layout.list_layout,mList);
 //實例化適配器

 ListView listView = (ListView) findViewById(R.id.list_view);
 //通過id實例化ListView

 listView.setAdapter(DataAdapter);
 //關聯listView與適配器

 }

 private void initData() {
 mList = new ArrayList<>();//創建數據源的容器
 mList.add(new Data("camera",R.drawable.camera));
 mList.add(new Data("games_control",R.drawable.games_control));
 mList.add(new Data("ringtone",R.drawable.ringtone));
 mList.add(new Data("settings",R.drawable.settings));
 mList.add(new Data("speech_balloon",R.drawable.speech_balloon));
 }
}

activity_first_aty.xml

<?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"
 android:gravity="center_horizontal" 
 tools:context="comeinsteinford.github.firstapplication.FirstAty">

 <ListView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/list_view">
 </ListView>

</RelativeLayout>

list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="horizontal"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <ImageView
 android:layout_width="70dp"
 android:layout_height="70dp"
 android:id="@+id/image"
 android:contentDescription="@string/text01"
 android:padding="10dp"/>
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textSize="30sp"
 android:id="@+id/textView"
 android:padding="10dp"/>
</LinearLayout>

這幾個代碼基本上也沒變,我只是在工程目錄下放置了一些圖片,用于listview中顯示,當然Data類與list_layout中的控件是一一對應的,可以添加其它兩邊都可適配的各類控件及屬性。

運行效果如下

運行效果

文章太長容易讓人看不下去,今天就到這里吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容