晋城景点:Android开发进阶 -- 通用适配器 CommonAdapter
时间:3个月前 阅读:85 评论:3
在Android‘开发中’,我们经常会用到ListView 这「个」组件,为了“将”ListView 《《【《‘〖“‘「“的”」’”〗’》】》内容展示出来》,〖‘我’们会去 实现[{“一”}「个」〗Adapter来适配,“将”Layout中《【《‘〖“‘「“的”」’”〗’》】》布局以列表《【《‘〖“‘「“的”」’”〗’》】》 形式展现到组件中[。
比如,『像』 GGTalk 安卓版《【《‘〖“‘「“的”」’”〗’》】》查找用户功能, 会把符合条件[《【《‘〖“‘「“的”」’”〗’》】》用户都列在下面:
为了达到这「个」效果,我们需要 实现[{“一”}「个」自定义《【《‘〖“‘「“的”」’”〗’》】》Adapter,{而其它地方《【《‘〖“‘「“的”」’”〗’》】》}ListView(也要 实现[{“一”})「个」Adapter,【这些】Adapter会(有)很多重复《【《‘〖“‘「“的”」’”〗’》】》代码,{非常繁琐},现在我就“将”(重复代码封装到)了{“一”}「个」通用《【《‘〖“‘「“的”」’”〗’》】》适配器CommonAdapter中,这《样》,在使用时只要「继承」CommonAdapter就可以了,如此就避免了大段代码《【《‘〖“‘「“的”」’”〗’》】》重复,“让”代码更简洁易懂。 我们先[来看看CommonAdapter《【《‘〖“‘「“的”」’”〗’》】》定义。
{“一”}.CommonAdapter 实现[
public abstract class CommonAdapter<T> extends BaseAdapter { private List<T> dataList; protected Context context; protected int item_layoutId=0; protected HashMap<Integer,Integer> layoutIdMap; //《多种》itemView〖时用到〗。 第{“一”}「个」int【「“【对应】”」】type( 类[型),『第』二「个」int【「“【对应】”」】 itemlayoutId /** * 『设置单「个」子(模版)』VIew, * @param context * @param datas 【绑定《【《‘〖“‘「“的”」’”〗’》】》{<对象>}集合】 * @param item_layoutId 被绑定《【《‘〖“‘「“的”」’”〗’》】》视图layoutID * */ public CommonAdapter(Context context, List<T> datas, int item_layoutId) { this.context=context; this.dataList=datas; this.item_layoutId=item_layoutId; } /** *《设置多「个」子(模版)》VIew, 【并配合重写】 getItemViewType(int position)(来确定是设置哪「个」(模版)) * @param context * @param datas 【绑定《【《‘〖“‘「“的”」’”〗’》】》{<对象>}集合】 * @param layoutIdMap 《多种》itemViewID Map 第{“一”}「个」int【「“【对应】”」】type( 类[型),『第』二「个」int【「“【对应】”」】 itemlayoutId */ public CommonAdapter(Context context, List<T> datas, HashMap<Integer,Integer> layoutIdMap) { this.context=context; this.dataList=datas; this.layoutIdMap=layoutIdMap; } @Override public int getViewTypeCount() { if(this.layoutIdMap==null) { return 1; } return this.layoutIdMap.size(); } @Override public int getCount() { return this.dataList.size(); } @Override public Object getItem(int position) { return this.dataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); return getConvertView(position,convertView,type); } private View getConvertView(int position,View convertView,int itemViewType) { if(convertView==null) { int layoutId =0; if(this.item_layoutId!=0) { layoutId=this.item_layoutId; } if (this.layoutIdMap != null) { layoutId = this.layoutIdMap.get(itemViewType); } convertView = LayoutInflater.from(context).inflate(layoutId, null); } T t = this.dataList.get(position); this.setConvertView(convertView,t,itemViewType); return convertView; } /** * 『局部更(“新”)数据』,调用{“一”}次getView()方法;Google推荐《【《‘〖“‘「“的”」’”〗’》】》做法 * * @param parent 要更(“新”)《【《‘〖“‘「“的”」’”〗’》】》listview * @param position 要更(“新”)《【《‘〖“‘「“的”」’”〗’》】》位置 */ public void onOneItemChanged(ListView parent, int position) { /**第{“一”}「个」可见《【《‘〖“‘「“的”」’”〗’》】》位置**/ int firstVisiblePosition = parent.getFirstVisiblePosition(); /**“最后”{“一”}「个」可见《【《‘〖“‘「“的”」’”〗’》】》位置**/ int lastVisiblePosition = parent.getLastVisiblePosition(); /**在看见范围内才更(“新”),『不可见《【《‘〖“‘「“的”」’”〗’》】》滑动后自动会调用』getView方法更(“新”)**/ if ((position >= firstVisiblePosition && position <= lastVisiblePosition)) { /**获取指定位置view{<对象>}**/ View view = parent.getChildAt(position - firstVisiblePosition); getView(position, view, parent); } } /** * 需要去 实现[《【《‘〖“‘「“的”」’”〗’》】》对item中《【《‘〖“‘「“的”」’”〗’》】》view《【《‘〖“‘「“的”」’”〗’》】》设置操作 * * @param convertView “转换后”《【《‘〖“‘「“的”」’”〗’》】》「试图」 * @param t Model{<对象>} * @param itemViewType 「试图」( 类[型)。【「“【对应】”」】layoutIdMap中《【《‘〖“‘「“的”」’”〗’》】》key */ protected abstract void setConvertView(View convertView, T t,int itemViewType); }
说明如下:
(1)泛型参数<T>就是我们要绑定数据Model{<对象>}《【《‘〖“‘「“的”」’”〗’》】》class( 类[型)。
(2)getViewTypeCount()方法会根据HashMap是否为空来识别是传入《【《‘〖“‘「“的”」’”〗’》】》单{“一”}(模版)还是多(模版).
(3)CommonAdapter还重写了getCount(),getItem(int position),getView,getConvertView等BaseAdapter 《【《‘〖“‘「“的”」’”〗’》】》方法[,【这些】方法《【《‘〖“‘「“的”」’”〗’》】》代码都基本每「个」Adapter都是{“一”}《样》《【《‘〖“‘「“的”」’”〗’》】》,我们只需关心 setConvertView 这「个」抽象方法,在子 类[中重写它,“将”{‘具体’}《【《‘〖“‘「“的”」’”〗’》】》逻辑和数据《【《‘〖“‘「“的”」’”〗’》】》绑定在此即可。
二.使用CommonAdapter
- 先建{“一”}「个」 类[「继承」CommonAdapter,在构造函数中调用父 类[《【《‘〖“‘「“的”」’”〗’》】》构造方法以初始化数据。 实现[ setConvertView 方法,“将”{<对象>}《【《‘〖“‘「“的”」’”〗’》】》数据绑定到(模版)上 即可
public class SearchFriendAdapter extends CommonAdapter<OrayUser> { /** * 『设置单「个」子(模版)』VIew, * @param context * @param datas 【绑定《【《‘〖“‘「“的”」’”〗’》】》{<对象>}集合】 * @param item_layoutId 被绑定《【《‘〖“‘「“的”」’”〗’》】》视图layoutID * */ public SearchFriendAdapter(Context context,List<OrayUser> datas,int item_layoutId) { super(context,datas,item_layoutId); } @Override protected void setConvertView(View view, OrayUser orayUser,int itemViewType) { ...{‘具体’}“将”{<对象>}《【《‘〖“‘「“的”」’”〗’》】》数据绑定到(模版)上 } }
- Activity中使用时new {“一”}「个」Adapter,然后“将”adapter绑定到 ListView
adapter = new SearchFriendAdapter(this,this.userList,R.layout.friend_child); listView.setAdapter(adapter);
- 更(“新”)“数据源中”《【《‘〖“‘「“的”」’”〗’》】》数据同步到View
//(有)2种方式“将”数据源同步到View adapter.notifyDataSetChanged();//全部刷(“新”) adapter.onOneItemChanged(ListView parent, int position);//刷(“新”)指定位置《【《‘〖“‘「“的”」’”〗’》】》数据
【三】. “让”CommonAdapter「{支持多模板}」
当然CommonAdapter还支持多(模版)《【《‘〖“‘「“的”」’”〗’》】》应用,我们只需“将”第{“一”}步中《【《‘〖“‘「“的”」’”〗’》】》Adapter 实现[稍稍做改动即可
public class ListViewAdapter extends CommonAdapter<ListViewItemModel> { /** *《设置多「个」子(模版)》VIew, 【并配合重写】 getItemViewType(int position)(来确定是设置哪「个」(模版)) * @param context * @param datas 【绑定《【《‘〖“‘「“的”」’”〗’》】》{<对象>}集合】 * @param layoutIdMap 《多种》itemViewID Map 第{“一”}「个」int【「“【对应】”」】type( 类[型),『第』二「个」int【「“【对应】”」】 itemlayoutId */ public ListViewAdapter(Context context, List<ListViewItemModel> datas, HashMap<Integer,Integer> layoutIdMap) { super(context,datas,layoutIdMap); } @Override public int getItemViewType(int position) { ListViewItemModel model= (ListViewItemModel)super.getItem(position); if(model.floatRight) { return 1; } return 0; } @Override protected void setConvertView(View view, ListViewItemModel listViewItemModel,int itemViewType) { //根据itemViewType 《【《‘〖“‘「“的”」’”〗’》】》<〖值〗>来识别是哪「个」(模版),以【「“【对应】”」】给(模版)绑定数据 } }
如上图我们“将”构造函数《【《‘〖“‘「“的”」’”〗’》】》“最后”{“一”}「个」参数从单{“一”}《【《‘〖“‘「“的”」’”〗’》】》layoutID 换成了 ‘(模版)集合《【《‘〖“‘「“的”」’”〗’》】》’HashMap,“再就是多加了” getItemViewType(int position) 方法来返回[ {‘具体’}Model【「“【对应】”」】《【《‘〖“‘「“的”」’”〗’》】》是哪{“一”}「个」(模版)( 类[型)(即hashMap 中《【《‘〖“‘「“的”」’”〗’》】》key<〖值〗>),使用时更(“新”)“数据源中”《【《‘〖“‘「“的”」’”〗’》】》数据同步到View和上面《【《‘〖“‘「“的”」’”〗’》】》单{“一”}(模版){“一”}《样》使用。(同上2种更(“新”)方法)
HashMap<Integer,Integer> layoutMap=new HashMap<>(); layoutMap.put(0,R.layout.listview_item);//key<〖值〗>【最好从】0开始向上递增,《否则可能会找不到》key《【《‘〖“‘「“的”」’”〗’》】》BUG layoutMap.put(1,R.layout.listview_right_item); adapter=new ListViewAdapter(this,models,layoutMap); listView.setAdapter(adapter);
四[.综合实例
“最后”我们还是以本文开头《【《‘〖“‘「“的”」’”〗’》】》查找用户《【《‘〖“‘「“的”」’”〗’》】》例子,来更全面地说明CommonAdapter《【《‘〖“‘「“的”」’”〗’》】》使用。页面截图如下:
1.(模版)布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/selector_item" android:descendantFocusability="blocksDescendants" android:gravity="center_vertical" android:orientation="horizontal" android:padding="4dp"> <ImageView android:id="@+id/ct_photo" android:layout_width="@dimen/headImageSize" android:layout_height="@dimen/headImageSize" android:layout_margin="5dp" android:src="@drawable/plus" /> <ImageView android:id="@+id/ct_status" android:layout_width="11dip" android:layout_height="11dip" android:layout_marginLeft="@dimen/headImageSize" android:layout_marginTop="@dimen/headImageSize" android:src='@drawable/status_2' /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:layout_alignTop="@id/ct_photo" android:layout_toRightOf="@id/ct_photo" > <TextView android:id="@+id/ct_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingBottom="5dp" android:paddingTop="0dp" android:text="name" android:textColor="@color/dimgrey" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/ct_describe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_toRightOf="@id/ct_name" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingBottom="5dp" android:paddingTop="0dp" android:text="describe" android:textColor="@color/dimgrey" android:textSize="14sp" android:visibility="gone" /> </LinearLayout> <TextView android:id="@+id/ct_sign" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/ct_photo" android:layout_toRightOf="@id/ct_photo" android:paddingLeft="5dp" android:text="sign" android:singleLine="true" android:ellipsize="start" android:textColor="@color/dimgrey" android:textSize="12sp" /> </RelativeLayout>
2.{‘具体’}「继承」CommonAdapter【 实现[子 类[】
public class SearchFriendAdapter extends CommonAdapter<OrayUser> { public SearchFriendAdapter(Context context,List<OrayUser> datas,int item_layoutId) { super(context,datas,item_layoutId); } @Override protected void setConvertView(View view, OrayUser orayUser,int itemViewType) { try{ SearchFriendAdapter.ViewHolder holder; if(view.getTag()==null) { holder = new SearchFriendAdapter.ViewHolder(view); view.setTag(holder); } else { holder = (SearchFriendAdapter.ViewHolder) view.getTag(); } HeadImgHelper.setUserHeadImg(holder.headImg,orayUser); if(orayUser.getName().equals(orayUser.getCommentName())) { holder.userName.setText(orayUser.getName()); } else { holder.userName.setText(orayUser.getCommentName()+"("+ orayUser.getName()+")"); } String catalogName= ClientGlobalCache.getInstance().getCurrentUser().getCatalogNameByFriend(orayUser.getUserID()); if(!StringHelper.isNullOrEmpty(catalogName)) { holder.describe.setText("[ "+ catalogName+" ]"); holder.describe.setVisibility(View.VISIBLE); } else { holder.describe.setText(""); holder.describe.setVisibility(View.GONE); } holder.orgName.setText(orayUser.getUserID()); }catch (Exception ex){ex.printStackTrace();} } private class ViewHolder { public ImageView headImg; public TextView userName; public TextView describe; public TextView orgName; public ViewHolder(View view) { this.headImg = (ImageView) view.findViewById(R.id.ct_photo); ImageView statusImg=(ImageView) view.findViewById(R.id.ct_status); statusImg.setVisibility(View.GONE); this.userName=(TextView) view.findViewById(R.id.ct_name); this.orgName=(TextView) view.findViewById(R.id.ct_sign); this.describe=(TextView) view.findViewById(R.id.ct_describe); } } }
3. Activity 类[ 核心代码
public class SearchFriendActivity extends Activity implements TextView.OnEditorActionListener{ private DrawableEditText input; private ListView listView; private TextView search_resultStr; private List<OrayUser> userList=new ArrayList<OrayUser>() ; private SearchFriendAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_friend); this.initView(); } private void initView() { TextView pageTitle=(TextView)findViewById(R.id.headerText); pageTitle.setText("查找用户"); search_resultStr =(TextView) findViewById(R.id.search_resultStr); listView=(ListView)findViewById(R.id.listview_user); listView.setOnItemClickListener(this); adapter = new SearchFriendAdapter(this,this.userList,R.layout.friend_child); listView.setAdapter(adapter); } /** * {执行点击搜索指令} * */ private void action_search(String idOrName) { List<OrayUser> temp_users=Manager.getInstance().doSearchUser(idOrName); search_resultStr.setText("没(有)找到符合条件《【《‘〖“‘「“的”」’”〗’》】》用户或群组"); this.setSearchResult(temp_users); } private void setSearchResult(List<OrayUser> temp_users) { this.userList.clear(); if(temp_users==null||temp_users.size()==0) { search_resultStr.setVisibility(View.VISIBLE); } else { for (OrayUser orayUser :temp_users) { if(orayUser.getUserID().equals(ClientGlobalCache.getInstance().getCurrentUser().getUserID())) { temp_users.remove(orayUser); break; } } this.userList.addAll(temp_users) ; search_resultStr.setVisibility(View.GONE); } this.adapter.notifyDataSetChanged(); } }
,
<皇冠体育>APP是{“一”}「个」开放皇冠代理APP{下载}、皇冠会员APP{下载}、皇冠线路APP{下载}、皇冠登录APP{下载}《【《‘〖“‘「“的”」’”〗’》】》平台,<皇冠体育>APP上最(“新”)登录线路、(“新”)2皇冠网址更(“新”)最快,<皇冠体育>APP开放皇冠会员注册、 皇冠代理开户等业务[。
网友评论
葡萄酒网
回复申博Sunbet:www.1888ss.com是最全面的网络生活服务平台,本着竭诚为您服务的宗旨,我们能够准确把握您的兴趣点,为您推荐海内外最热门的网络活动,内容涵盖了免费娱乐游戏,免费追剧,高收益投资等生活内容,不需注册可享VIP级服务,还有最权威的理财投资顾问,能迅速发现投资黄金区,不影响工作,不影响家庭,无需注册,变现方便,比上班轻松,比创业成功,投资就有回报,是高级金融财经人士都在用的理财高收益平台,每个聪明年轻人都在这里投资,另外,还有更多精彩等你发掘!没浪费我时间
ALLBET欧博真人客户端
回复@葡萄酒网 丽水新闻网丽水新闻网是浙江省本地的重点新闻网,也是丽水人自己的新闻生活服务综合性门户网站。提供以新闻为主体,生活服务类资讯为辅的综合性新闻讯息,是一个为“秀山丽水,画乡莲都”专门量身定做的汇集“媒体资讯、生活服务、问政丽水、公共信息查询”为一体的便民服务网站。24小时不间断聚焦浙江本土时事,一秒即可观看、事实热点一目了然、轻松掌握贴心服务。可以可以,写到我心了
ALLBET官网开户网址
回复永诚保险永诚保险保护您的财产更保护您。拥有5000多名员工,注册资本金高达21.78亿。上永城保险官网,您就能了解到更多关于我们的信息。不论是您的爱车还是乘坐公共交通工具出行,甚至是您的健康,只需要放心交给我们,我们会给您全方位的保障。语文学渣羡慕了