Android ListView萬(wàn)能適配器實(shí)例代碼
ListView是開(kāi)發(fā)中最常用的控件了,但是總是會(huì)寫重復(fù)的代碼,浪費(fèi)時(shí)間又沒(méi)有意義。
最近參考一些資料,發(fā)現(xiàn)一個(gè)萬(wàn)能ListView適配器,代碼量少,節(jié)省時(shí)間,總結(jié)一下分享給大家。
首先有一個(gè)自定義的Adapter繼承于BaseAdapter,下面是自定義的Adapter,精華在getView()方法中
package com.example.mylistview.util; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class CommonAdapter<T> extends BaseAdapter { /** * 上下文 */ private Context mContext; /** * 實(shí)體類集合 */ private List<T> mDatas; private LayoutInflater mInflater; /** * 控件id */ private int mlayoutId; public CommonAdapter(Context context, List<T> datas, int layoutId) { this.mContext = context; this.mDatas = datas; this.mlayoutId = layoutId; mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return mDatas.size(); } @Override public T getItem(int arg0) { // TODO Auto-generated method stub return mDatas.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub ViewHolder holder = ViewHolder.get(mContext, arg1, arg2, mlayoutId, arg0); convert(holder, getItem(arg0)); return holder.getConvertView(); } public abstract void convert(ViewHolder holder, T t); }
以上的抽象方法convert(ViewHolder holder, T t);就相當(dāng)于以前通用代碼中的
viewHolder.mTextView = (TextView) convertView .findViewById(R.id.id_tv_title);
viewHolder.mTextView.setText(Bean.getName());
找到控件的id再去設(shè)施setText等重復(fù)的代碼方法中的參數(shù)ViewHolder holder, T t holder就相當(dāng)于以前通用代碼中的viewHolder,t就相當(dāng)于一個(gè)自己定義的實(shí)體類Bean。
以上代碼中g(shù)etView()方法中有一個(gè)ViewHolder是需要自己聲明的,以下是代碼以及詳細(xì)注釋:
package com.example.mylistview.util; import android.content.Context; import android.graphics.Bitmap; import android.renderscript.Type; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class ViewHolder { /** * SparseArray類存放View集合 */ private SparseArray<View> mViews; /** * */ private int mPosition; /** * 布局文件 */ private View mConvertView; public View getConvertView() { return mConvertView; } public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mViews = new SparseArray<View>(); this.mPosition = position; this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); this.mConvertView.setTag(this); } /** * 拿到一個(gè)ViewHolder對(duì)象 * @param context * @param convertView * @param parent * @param layoutId * @param position * @return */ public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (null == convertView) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 通過(guò)控件的id獲取對(duì)應(yīng)的控件,如果沒(méi)有則加入views * @param viewId * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (null == view) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } /** * 為TextView設(shè)置字符串 * @param viewId * @param text * @return */ public ViewHolder setText(int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } /** * 為ImageView設(shè)置圖片 * * @param viewId * @param drawableId * @return */ public ViewHolder setImageResource(int viewId, int drawableId) { ImageView view = getView(viewId); view.setImageResource(drawableId); return this; } public int getPosition() { return mPosition; } }
再寫一個(gè)Adapter繼承于萬(wàn)能適配器CommonAdapter,還是要寫一個(gè)自己的Adapter,因?yàn)橐粋€(gè)項(xiàng)目可能會(huì)有多個(gè)ListView,但是每個(gè)的item元素,布局都會(huì)有所不同的,這個(gè)淚用來(lái)區(qū)分不同的ListView與自己所對(duì)應(yīng)的item.這個(gè)代碼量較少完全可以寫成內(nèi)部類在Activity.java中.
package com.example.mylistview.adapter; import java.util.List; import android.content.Context; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; import com.example.mylistview.R; import com.example.mylistview.domain.Bean; import com.example.mylistview.util.CommonAdapter; import com.example.mylistview.util.ViewHolder; public class MyAdapter extends CommonAdapter<Bean> { public MyAdapter(Context context, List<Bean> datas, int layoutId) { super(context, datas, layoutId); // TODO Auto-generated constructor stub } @Override public void convert(ViewHolder holder, final Bean bean) { // TODO Auto-generated method stub holder.setText(R.id.tv_title, bean.getTitle()) .setText(R.id.tv_desc, bean.getDesc()) .setText(R.id.tv_time, bean.getTime()) .setText(R.id.tv_phone, bean.getPhone()); /** * 防止CheckBox混亂 */ final CheckBox cBox = (CheckBox)(holder.getView(R.id.cb)); if (cBox != null) { cBox.setChecked(bean.isChecked()); cBox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { bean.setChecked(cBox.isChecked()); } }); } } }
優(yōu)化之后用適配器的時(shí)候就簡(jiǎn)單多了下面是實(shí)體類,item和MainActivity.java中的代碼:
實(shí)體類:
package com.example.mylistview.domain; public class Bean { private String title; private String desc; private String time; private String phone; private boolean isChecked; public boolean isChecked() { return isChecked; } public void setChecked(boolean isChecked) { this.isChecked = isChecked; } /** * @param title * @param desc * @param time * @param phone */ public Bean(String title, String desc, String time, String phone) { this.title = title; this.desc = desc; this.time = time; this.phone = phone; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
MainActivity.java:
重點(diǎn)代碼:
參數(shù)有上下文,集合,和自己對(duì)應(yīng)的item就可以了
adapter = new MyAdapter(this, mDatas, R.layout.item);
package com.example.mylistview.ui; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import com.example.mylistview.R; import com.example.mylistview.adapter.MyAdapter; import com.example.mylistview.domain.Bean; public class MainActivity extends Activity { private ListView listView; private List<Bean> mDatas; /** * 適配器 */ private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); listener(); } private void listener() { // TODO Auto-generated method stub listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); } private void initData() { // TODO Auto-generated method stub mDatas = new ArrayList<Bean>(); Bean bean = new Bean("Android新技能 Get", "Android-打造萬(wàn)能的ListView和GridView適配器", "2015-08-05", "10086"); mDatas.add(bean); bean = new Bean("撿到權(quán)志龍一個(gè)", "在星巴克撿到權(quán)志龍一個(gè)", "2015-08-06", "10086"); mDatas.add(bean); bean = new Bean("GetTOP一個(gè)", "在韓國(guó)首爾撿到TOP一個(gè)", "2015-08-07", "10086"); mDatas.add(bean); adapter = new MyAdapter(this, mDatas, R.layout.item); listView.setAdapter(adapter); } private void initView() { // TODO Auto-generated method stub listView = (ListView) findViewById(R.id.listView); } }
item布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" > <CheckBox android:focusable="false" android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerInParent="true" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:singleLine="true" android:text="Android新技能 Get" /> <TextView android:id="@+id/tv_desc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/tv_title" android:layout_marginTop="10dp" android:layout_toLeftOf="@id/cb" android:maxLines="2" android:text="Android-打造萬(wàn)能的ListView和GridView適配器" android:textColor="#898989" /> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_desc" android:layout_marginTop="10dp" android:text="2015-08-05" android:textColor="#898989" android:textSize="12sp" /> <TextView android:id="@+id/tv_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@id/tv_desc" android:layout_marginTop="10dp" android:background="#20793D" android:maxLines="1" android:text="10086" android:padding="4dp" android:textColor="#FFF" /> </RelativeLayout>
效果圖:
用這個(gè)去適配另一個(gè)不同的布局:
新布局的Adapter一樣繼承自己的萬(wàn)能adapter:CommonAdapter
package com.example.mylistview.adapter; import java.util.List; import java.util.Map; import android.content.Context; import com.example.mylistview.R; import com.example.mylistview.util.CommonAdapter; import com.example.mylistview.util.ViewHolder; public class SecondAdapter extends CommonAdapter<Map<String, String>> { public SecondAdapter(Context context, List<Map<String, String>> datas, int layoutId) { super(context, datas, layoutId); // TODO Auto-generated constructor stub } @Override public void convert(ViewHolder holder, Map<String, String> t) { // TODO Auto-generated method stub holder.setText(R.id.tv_item2values, t.get("values")); } }
Activity.java代碼:
package com.example.mylistview.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import com.example.mylistview.R; import com.example.mylistview.adapter.MyAdapter; import com.example.mylistview.adapter.SecondAdapter; public class SecondActivity extends Activity { private ListView listView_second; private SecondAdapter secondAdapter; private List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); initData(); } private void initData() { // TODO Auto-generated method stub for (int i = 0; i < 4; i++) { Map map = new HashMap<String, String>(); map.put("values", "條目" + i); lists.add(map); } secondAdapter = new SecondAdapter(this, lists, R.layout.item2); listView_second.setAdapter(secondAdapter); } private void initView() { // TODO Auto-generated method stub listView_second = (ListView) findViewById(R.id.listView_second); } }
item:
<?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" > <TextView android:id="@+id/tv_item2values" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="ffffff" android:layout_margin="16dp" android:gravity="center" /> </LinearLayout>
效果圖:
以上就是對(duì)Android ListView 的資料整理,希望能給大家?guī)?lái)幫助!
- Android ListView和Adapter數(shù)據(jù)適配器的簡(jiǎn)單介紹
- 詳解xamarin Android 實(shí)現(xiàn)ListView萬(wàn)能適配器
- Android ListView適配器(Adapter)優(yōu)化方法詳解
- Android巧用XListView實(shí)現(xiàn)萬(wàn)能下拉刷新控件
- android使用flutter的ListView實(shí)現(xiàn)滾動(dòng)列表的示例代碼
- Android自定義控件ListView下拉刷新的代碼
- MVPXlistView展示上拉下拉效果
- Android通過(guò)代碼控制ListView上下滾動(dòng)的方法
- Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問(wèn)題
- ListView通用泛型適配器
相關(guān)文章
簡(jiǎn)單實(shí)現(xiàn)android短信發(fā)送器
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)android短信發(fā)送器 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01基于Android AIDL進(jìn)程間通信接口使用介紹
本篇文章小編為大家介紹,基于Android AIDL進(jìn)程間通信接口使用介紹。需要的朋友參考下2013-04-04Android使用lottie加載json動(dòng)畫的示例代碼
本篇文章主要介紹了Android使用lottie加載json動(dòng)畫的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Android組件創(chuàng)建DrawerLayout導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android組件創(chuàng)建DrawerLayout導(dǎo)航的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android實(shí)現(xiàn)過(guò)渡動(dòng)畫、引導(dǎo)頁(yè) Android判斷是否第一次啟動(dòng)App
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)過(guò)渡動(dòng)畫、引導(dǎo)頁(yè),以及Android判斷是否第一次啟動(dòng)App,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android開(kāi)發(fā)手冊(cè)Chip監(jiān)聽(tīng)及ChipGroup監(jiān)聽(tīng)
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)Chip監(jiān)聽(tīng)及ChipGroup監(jiān)聽(tīng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載
這篇文章主要介紹了Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05