Android快速開發之appBase——(2).萬能的Adapter,androidappbase
Android快速開發之appBase——(2).萬能的Adapter
android的Adapter是常用的一個組件,自訂的adapter基本上都是整合BaseAdapter,然後實現getView等一系列方法。時間長了,難免讓人感覺到寫的重複性代碼過多,那麼萬能的Adapter講解放你的雙手。
對比
package com.snicesoft.appbase.demo;import java.util.ArrayList;import java.util.List;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class ListBaseAdapter extends BaseAdapter { List<Data> datas = new ArrayList<ListBaseAdapter.Data>(); public void setDatas(List<Data> datas) { this.datas = datas; notifyDataSetChanged(); } public class Holder { TextView tvTitle; ImageView imgIcon; } public static class Data { String title; int icon; public Data(String title, int icon) { super(); this.title = title; this.icon = icon; } } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder; if(convertView == null){ holder = new Holder(); convertView = View.inflate(parent.getContext(), R.layout.item_listdemo, null); holder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle); holder.imgIcon = (ImageView) convertView.findViewById(R.id.imgIcon); convertView.setTag(holder); }else{ holder = (Holder) convertView.getTag(); } holder.tvTitle.setText(datas.get(position).title); holder.imgIcon.setImageResource(datas.get(position).icon); return convertView; }}
package com.snicesoft.appbase.demo;import android.content.Context;import android.widget.ImageView;import android.widget.TextView;import com.snicesoft.avlib.annotation.DataBind;import com.snicesoft.avlib.annotation.DataType;import com.snicesoft.avlib.annotation.Id;import com.snicesoft.avlib.annotation.Layout;import com.snicesoft.avlib.rule.IData;import com.snicesoft.avlib.rule.IHolder;import com.snicesoft.avlib.widget.AvAdapter;@Layout(R.layout.item_listdemo)public class ListDemoAdapter extends AvAdapter<ListDemoAdapter.Holder, ListDemoAdapter.Data> { public class Holder extends IHolder { @Id(R.id.tvTitle) TextView tvTitle; @Id(R.id.imgIcon) ImageView imgIcon; @Override public void initViewParams() { } } public static class Data extends IData { @DataBind(id = R.id.tvTitle) String title; @DataBind(id = R.id.imgIcon, dataType = DataType.IMG) int icon; public Data(String title, int icon) { super(); this.title = title; this.icon = icon; } } public ListDemoAdapter(Context context) { super(context); } @Override public Holder newHolder() { return new Holder(); }}
- 結論:不用再寫getView方法以及各種findviewbyid、getcout等方法。只需要掌握holder和data的配置規則就可以便於使用。
Activity中使用
package com.snicesoft.appbase.demo;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import com.snicesoft.avlib.annotation.DataBind;import com.snicesoft.avlib.annotation.DataType;import com.snicesoft.avlib.annotation.Id;import com.snicesoft.avlib.annotation.Layout;import com.snicesoft.avlib.rule.IData;import com.snicesoft.avlib.rule.IHolder;import com.snicesoft.base.BaseActivity;@Layout(R.layout.activity_main)public class MainActivity extends BaseActivity<MainActivity.Holder, MainActivity.Data> { public class Holder extends IHolder { @Id(R.id.textView1) TextView textView1; @Id(R.id.button1) Button button1; @Id(R.id.listView1) ListView listView1; @Override public void initViewParams() { } } public class Data extends IData { @DataBind(id = R.id.textView1) String tv1 = "我是自動綁定的TextView"; @DataBind(id = R.id.button1) String btn1 = "我是自動綁定的Button"; @DataBind(id = R.id.listView1, dataType = DataType.ADAPTER)// ListBaseAdapter adapter = new ListBaseAdapter(); ListDemoAdapter adapter = new ListDemoAdapter(MainActivity.this); } @Override public Data newData() { return new Data(); } @Override public Holder newHolder() { return new Holder(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);// List<ListBaseAdapter.Data> datas = new ArrayList<ListBaseAdapter.Data>(); List<ListDemoAdapter.Data> datas = new ArrayList<ListDemoAdapter.Data>(); for (int i = 1; i <= 10; i++) {// datas.add(new ListBaseAdapter.Data("標題"+i, R.drawable.ic_launcher)); datas.add(new ListDemoAdapter.Data("標題"+i, R.drawable.ic_launcher)); } _data.adapter.addAll(datas); }}
說明
- ListDemoAdapter是由代碼產生器產生:包括layout的xml檔案、Holder和Data的主體
- avlib架構基於註解配置,簡化代碼,讓開發人員更加關注其他業務的處理,UI上的處理將會越來越簡單清晰。
最後
歡迎大家指點,有好的想法可以提出,我將會不斷最佳化架構。