完美實(shí)現(xiàn)ExpandableListView二級(jí)分欄效果
本文實(shí)例為大家分享了ExpandableListView二級(jí)分欄效果的具體代碼,供大家參考,具體內(nèi)容如下
對(duì)ExpandableListView控件進(jìn)行封裝(未自定義)直接上代碼:
通用ViewHolder類,僅在setImageResource中添加代碼
package com.svp.haoyan.expandablelistview.tool; import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; /** * Created by haoyan on 2016/3/24. */ public class ViewHolder { //存儲(chǔ)數(shù)據(jù) private SparseArray<View> mViews; private int mPosition; private View mConvertView; private boolean misExpanded; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position,boolean isExpanded) { this.mPosition=position; this.mViews= new SparseArray<View>(); this.misExpanded=isExpanded; //三 mConvertView= LayoutInflater.from(context).inflate(layoutId,parent,false); //一 mConvertView.setTag(this); } public static ViewHolder get(Context context,View convertView, ViewGroup parent,int layoutId,int position,boolean isExpanded){ if (convertView==null){ return new ViewHolder(context,parent,layoutId,position,isExpanded); }else { //五 六 ViewHolder holder=(ViewHolder)convertView.getTag(); holder.mPosition=position; return holder; } } //通過(guò)viewId獲取控件 //泛型T返回子類 public <T extends View> T getView(int viewId){ View view =mViews.get(viewId); if (view==null){ //四 view=mConvertView.findViewById(viewId); mViews.put(viewId,view); } return (T)view; } //八 public View getmConvertView() { return mConvertView; } /** * 設(shè)置TextView的值 * @param viewId * @param text * @return */ //四 七 九 public ViewHolder setText(int viewId,String text){ TextView tv= getView(viewId); tv.setText(text); return this; } /** * 一參傳id,二參傳圖片地址,三參為true則調(diào)用點(diǎn)擊變化效果,默認(rèn)為false. * */ public ViewHolder setImageResource(int viewId,int resId,boolean expanded){ ImageView view= getView(viewId); view.setImageResource(resId); if (expanded){ if (misExpanded){ view.setVisibility(View.GONE); }else { view.setVisibility(View.VISIBLE); } } return this; } public ViewHolder setImageBitamp(int viewId,Bitmap bitmap){ ImageView view= getView(viewId); view.setImageBitmap(bitmap); return this; } public ViewHolder setImageURI(int viewId,String uri){ ImageView view= getView(viewId); // Imageloader.getInstance().loadImg(view,uri); return this; } }
實(shí)體類Expand_DTO:
package com.svp.haoyan.expandablelistview.dto; /** * Created by haoyan on 2016/5/7. */ public class Expand_DTO { private String name; private String contents; private int pic; private int photo; public static class Expand_child { private String childname; private String childcont; public String getChildname() { return childname; } public void setChildname(String childname) { this.childname = childname; } public String getChildcont() { return childcont; } public void setChildcont(String childcont) { this.childcont = childcont; } } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContents() { return contents; } public void setContents(String contents) { this.contents = contents; } public int getPic() { return pic; } public void setPic(int pic) { this.pic = pic; } public int getPhoto() { return photo; } public void setPhoto(int photo) { this.photo = photo; } }
接下來(lái)是最主要的Adapter:
package com.svp.haoyan.expandablelistview; import android.content.Context; import android.database.DataSetObserver; import android.view.View; import android.view.ViewGroup; import android.widget.ExpandableListAdapter; import com.svp.haoyan.expandablelistview.tool.ViewHolder; import java.util.List; import java.util.Map; /** * Created by haoyan on 2016/4/28. */ public abstract class MyExpandableListAdapter<T,F>implements ExpandableListAdapter { private Context mcontext; private List<T> mexpand_dtos; private Map<Integer, List<F>> mmap = null; public MyExpandableListAdapter(Context context, List<T> expand_dtos,Map<Integer, List<F>> map) { this.mcontext = context; this.mexpand_dtos = expand_dtos; this.mmap=map; } /*注冊(cè)一個(gè)觀察者(observer),當(dāng)此適配器數(shù)據(jù)修改時(shí)即調(diào)用此觀察者。*/ @Override public void registerDataSetObserver(DataSetObserver observer) { } /*取消先前通過(guò)registerDataSetObserver(DataSetObserver)方式注冊(cè)進(jìn)該適配器中的觀察者對(duì)象*/ @Override public void unregisterDataSetObserver(DataSetObserver observer) { } /*獲取組的個(gè)數(shù)*/ @Override public int getGroupCount() { return mexpand_dtos.size(); } /*返回在指定Group的Child數(shù)目。*/ @Override public int getChildrenCount(int groupPosition) { return mmap.get(groupPosition).size(); } //獲取當(dāng)前父item的數(shù)據(jù) @Override public T getGroup(int groupPosition) { return mexpand_dtos.get(groupPosition); } /*獲取與在指定group給予child相關(guān)的數(shù)據(jù)。*/ @Override public F getChild(int groupPosition, int childPosition) { return (mmap.get(groupPosition).get(childPosition)); } /*獲取指定組的ID*/ @Override public long getGroupId(int groupPosition) { return groupPosition; } //得到子item的ID @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //組和子元素是否持有穩(wěn)定的ID,也就是底層數(shù)據(jù)的改變不會(huì)影響到它們。(沒(méi)效果) @Override public boolean hasStableIds() { return true; } //設(shè)置父item組件 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_groupview, groupPosition,isExpanded); convert(viewHolder, getGroup(groupPosition)); return viewHolder.getmConvertView(); } //自己寫 public abstract void convert(ViewHolder viewHolder, T t); public abstract void convertchild(ViewHolder viewHolder, F f); //設(shè)置子item的組件 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_childview, groupPosition,isLastChild); convertchild(viewHolder, getChild(groupPosition,childPosition)); return viewHolder.getmConvertView(); /*子元素是否處于組中的最后一個(gè)(對(duì)每個(gè)組的最后一個(gè)進(jìn)行操作)*/ //boolean isLastChild /*下邊是未封裝代碼,提供參考*/ // String Childname = (mmap.get(groupPosition).get(childPosition)).getChildname(); // LayoutInflater inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // convertView = inflater.inflate(R.layout.expand_childview, null); // TextView tv_child = (TextView) convertView.findViewById(R.id.tv_child); // tv_child.setText(Childcont); } /*是否選中指定位置上的子元素。*/ @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } /*true所有條目可以選擇和點(diǎn)擊*/ @Override public boolean areAllItemsEnabled() { return false; } /*如果當(dāng)前適配器不包含任何數(shù)據(jù)則返回True。經(jīng)常用來(lái)決定一個(gè)空視圖是否應(yīng)該被顯示。 一個(gè)典型的實(shí)現(xiàn)將返回表達(dá)式getCount() == 0的結(jié)果,但是由于getCount()包含了頭部和尾部,適配器可能需要不同的行為。*/ @Override public boolean isEmpty() { return false; } /*當(dāng)組展開(kāi)狀態(tài)的時(shí)候此方法被調(diào)用。*/ @Override public void onGroupExpanded(int groupPosition) { } /*當(dāng)組收縮狀態(tài)的時(shí)候此方法被調(diào)用。*/ @Override public void onGroupCollapsed(int groupPosition) { } /*根據(jù)所給的子ID號(hào)和組ID號(hào)返回唯一的ID。此外,若hasStableIds()是true,那么必須要返回穩(wěn)定的ID。*/ @Override public long getCombinedChildId(long groupId, long childId) { return 0; } /*同上*/ @Override public long getCombinedGroupId(long groupId) { return 0; } }
最后是調(diào)用類Activity:
package com.svp.haoyan.expandablelistview; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ExpandableListView; import com.svp.haoyan.expandablelistview.dto.Expand_DTO; import com.svp.haoyan.expandablelistview.tool.ViewHolder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class MainActivity extends AppCompatActivity { private ExpandableListView elistview; private List<Expand_DTO> expanddata; private HashMap<Integer, List<Expand_DTO.Expand_child>> map = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataView(); expandView(); } private void expandView() { elistview = (ExpandableListView) findViewById(R.id.expandable_lv); elistview.setAdapter(new MyExpandableListAdapter<Expand_DTO,Expand_DTO.Expand_child>(this, expanddata,map) { @Override public void convert(ViewHolder viewHolder, Expand_DTO expand_dto) { viewHolder.setText(R.id.tv_expand, expand_dto.getName()) .setText(R.id.tv_expand_two, expand_dto.getContents()) .setImageResource(R.id.img_expand, expand_dto.getPic(),false) .setImageResource(R.id.img_expand_two, expand_dto.getPhoto(),false); } @Override public void convertchild(ViewHolder viewHolder, Expand_DTO.Expand_child expand_child) { viewHolder.setText(R.id.tv_child,expand_child.getChildname()) .setText(R.id.tv_child2,expand_child.getChildcont()); } }); //去掉自帶箭頭 elistview.setGroupIndicator(null); } private void dataView() { expanddata = new ArrayList<Expand_DTO>(); Expand_DTO bean_zero = new Expand_DTO(); bean_zero.setName("android新技能1"); bean_zero.setContents("1"); bean_zero.setPic(R.drawable.icon_check); bean_zero.setPhoto(R.drawable.travel_airfare_cn_position); expanddata.add(bean_zero); Expand_DTO bean_one = new Expand_DTO(); bean_one.setName("android新技能2"); bean_one.setContents("2"); bean_one.setPic(R.drawable.icon_check); bean_one.setPhoto(R.drawable.travel_airfare_cn_position); expanddata.add(bean_one); Expand_DTO bean_two = new Expand_DTO(); bean_two.setName("android新技能3"); bean_two.setContents("3"); bean_two.setPic(R.drawable.icon_check); bean_two.setPhoto(R.drawable.travel_airfare_cn_position); expanddata.add(bean_two); //這里可以使用SparseArray優(yōu)化性能 map = new HashMap<Integer, List<Expand_DTO.Expand_child>>(); List<Expand_DTO.Expand_child> expand_children_zero=new ArrayList<Expand_DTO.Expand_child>(); Expand_DTO.Expand_child child1=new Expand_DTO.Expand_child(); child1.setChildname("11111"); child1.setChildcont("22222"); expand_children_zero.add(child1); Expand_DTO.Expand_child child2=new Expand_DTO.Expand_child(); child2.setChildname("3333333"); child2.setChildcont("4444444"); expand_children_zero.add(child2); map.put(0,expand_children_zero); List<Expand_DTO.Expand_child> expand_children_one=new ArrayList<Expand_DTO.Expand_child>(); Expand_DTO.Expand_child child3=new Expand_DTO.Expand_child(); child3.setChildname("55555"); child3.setChildcont("66666"); expand_children_one.add(child3); Expand_DTO.Expand_child child4=new Expand_DTO.Expand_child(); child4.setChildname("77777"); child4.setChildcont("88888"); expand_children_one.add(child4); map.put(1,expand_children_one); List<Expand_DTO.Expand_child> children_data_two=new ArrayList<Expand_DTO.Expand_child>(); Expand_DTO.Expand_child child5=new Expand_DTO.Expand_child(); child5.setChildname("99999"); child5.setChildcont("00000"); children_data_two.add(child5); Expand_DTO.Expand_child child6=new Expand_DTO.Expand_child(); child6.setChildname("12345"); child6.setChildcont("54321"); children_data_two.add(child6); map.put(2,children_data_two); } }
完活布局很簡(jiǎn)單就不貼出來(lái)了,加上圖片有圖有真相:
源碼下載:ExpandableListView二級(jí)分欄效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android ExpandableListView雙層嵌套實(shí)現(xiàn)三級(jí)樹(shù)形菜單
- ExpandableListView實(shí)現(xiàn)二級(jí)列表購(gòu)物車
- ExpandableListView實(shí)現(xiàn)簡(jiǎn)單二級(jí)列表
- Android中使用Expandablelistview實(shí)現(xiàn)微信通訊錄界面
- Android 關(guān)于ExpandableListView刷新問(wèn)題的解決方法
- Android 關(guān)于ExpandableListView去掉里頭分割線的方法
- Android 中使用ExpandableListView 實(shí)現(xiàn)分組的實(shí)例
- Android UI控件ExpandableListView基本用法詳解
- Android使用ExpandableListView實(shí)現(xiàn)三層嵌套折疊菜單
相關(guān)文章
Flutter pageview切換指示器的實(shí)現(xiàn)代碼
這篇文章主要介紹了Flutter pageview切換指示器的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Android學(xué)習(xí)筆記之Shared Preference
在之前遇到有個(gè)需求是要改settings里面自動(dòng)轉(zhuǎn)屏的首選項(xiàng),于是就學(xué)習(xí)了下Shared Preference。Shared Preference是一種簡(jiǎn)單的、輕量級(jí)的鍵/值對(duì)機(jī)制,用于保存原始應(yīng)用程序數(shù)據(jù),最常見(jiàn)的就是首選項(xiàng)2013-09-09Android實(shí)現(xiàn)底部切換標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部切換標(biāo)簽,嵌套Fragment,方便自定義布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07超簡(jiǎn)單的幾行代碼搞定Android底部導(dǎo)航欄功能
這篇文章主要介紹了超簡(jiǎn)單的幾行代碼搞定Android底部導(dǎo)航欄功能,需要的朋友可以參考下2018-03-03android 幀動(dòng)畫,補(bǔ)間動(dòng)畫,屬性動(dòng)畫的簡(jiǎn)單總結(jié)
本文主要對(duì)android 幀動(dòng)畫,補(bǔ)間動(dòng)畫,屬性動(dòng)畫進(jìn)行了簡(jiǎn)單總結(jié),具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01Android開(kāi)發(fā)中常見(jiàn)問(wèn)題
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)中常見(jiàn)問(wèn)題,主要涉及了七個(gè)問(wèn)題,希望能幫助到大家,感興趣的小伙伴們可以參考一下2016-06-06關(guān)于Android SDCard存儲(chǔ)的問(wèn)題
本篇文章小編為大家介紹,關(guān)于Android SDCard存儲(chǔ)的問(wèn)題。需要的朋友參考下2013-04-04Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Flutter封裝組動(dòng)畫混合動(dòng)畫AnimatedGroup示例詳解
這篇文章主要為大家介紹了Flutter封裝組動(dòng)畫混合動(dòng)畫AnimatedGroup示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01