android二级listview列表实现代码
2023-06-13 09:14:43 时间
今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式。
这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的。可能是因为平板屏幕比较大,而且也能展现更多的内容。
下面来看一下我的实现步骤。
首先自定义一个listview,代码如下:
复制代码代码如下:
这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的。可能是因为平板屏幕比较大,而且也能展现更多的内容。
下面来看一下我的实现步骤。
首先自定义一个listview,代码如下:
publicclassMyListViewextendsListViewimplementsRunnable{
privatefloatmLastDownY=0f;
privateintmDistance=0;
privateintmStep=10;
privatebooleanmPositive=false;
publicMyListView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicMyListView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
publicMyListView(Contextcontext){
super(context);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(mLastDownY==0f&&mDistance==0){
mLastDownY=event.getY();
returntrue;
}
break;
caseMotionEvent.ACTION_CANCEL:
break;
caseMotionEvent.ACTION_UP:
if(mDistance!=0){
mStep=1;
mPositive=(mDistance>=0);
this.post(this);
returntrue;
}
mLastDownY=0f;
mDistance=0;
break;
caseMotionEvent.ACTION_MOVE:
if(mLastDownY!=0f){
mDistance=(int)(mLastDownY-event.getY());
if((mDistance<0&&getFirstVisiblePosition()==0&&getChildAt(0).getTop()==0)||(mDistance>0&&getLastVisiblePosition()==getCount()-1)){
mDistance/=2;
scrollTo(0,mDistance);
returntrue;
}
}
mDistance=0;
break;
}
returnsuper.onTouchEvent(event);
}
publicvoidrun(){
mDistance+=mDistance>0?-mStep:mStep;
scrollTo(0,mDistance);
if((mPositive&&mDistance<=0)||(!mPositive&&mDistance>=0)){
scrollTo(0,0);
mDistance=0;
mLastDownY=0f;
return;
}
mStep+=1;
this.postDelayed(this,10);
}
}
然后看一下xml的布局:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.example.multilistview.MyListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:scrollbars="none"
android:divider="@drawable/listitem_divide"
android:listSelector="#00000000"
android:background="#e4e3de"
>
</com.example.multilistview.MyListView>
<com.example.multilistview.MyListView
android:id="@+id/subListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#e4e3de"
>
</com.example.multilistview.MyListView>
</LinearLayout>
两个自定义的listview横向布局,然后是父listview的适配器
publicclassMyAdapterextendsBaseAdapter{
Contextcontext;
LayoutInflaterinflater;
String[]foods;
intlast_item;
int[]images;
privateintselectedPosition=-1;
publicMyAdapter(Contextcontext,String[]foods,int[]images){
this.context=context;
this.foods=foods;
this.images=images;
inflater=LayoutInflater.from(context);
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnfoods.length;
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
ViewHolderholder=null;
if(convertView==null){
convertView=inflater.inflate(R.layout.mylist_item,null);
holder=newViewHolder();
holder.textView=(TextView)convertView.findViewById(R.id.textview);
holder.imageView=(ImageView)convertView.findViewById(R.id.imageview);
holder.layout=(LinearLayout)convertView.findViewById(R.id.colorlayout);
convertView.setTag(holder);
}
else{
holder=(ViewHolder)convertView.getTag();
}
//设置选中效果
if(selectedPosition==position)
{
holder.textView.setTextColor(Color.BLUE);
holder.layout.setBackgroundColor(Color.LTGRAY);
}else{
holder.textView.setTextColor(Color.WHITE);
holder.layout.setBackgroundColor(Color.TRANSPARENT);
}
holder.textView.setText(foods[position]);
holder.textView.setTextColor(Color.BLACK);
holder.imageView.setBackgroundResource(images[position]);
returnconvertView;
}
publicstaticclassViewHolder{
publicTextViewtextView;
publicImageViewimageView;
publicLinearLayoutlayout;
}
publicvoidsetSelectedPosition(intposition){
selectedPosition=position;
}
}
对应的item布局:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/colorlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="16dip"
android:layout_marginTop="8dip"
android:layout_marginLeft="8dip"
android:layout_marginBottom="8dip"/>
<!--android:background="@drawable/selector"自定义listview样式-->
</LinearLayout>
然后是子适配器代码:
publicclassSubAdapterextendsBaseAdapter{
Contextcontext;
LayoutInflaterlayoutInflater;
String[][]cities;
publicintfoodpoition;
publicSubAdapter(Contextcontext,String[][]cities,intposition){
this.context=context;
this.cities=cities;
layoutInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.foodpoition=position;
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returncities.length;
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returngetItem(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
ViewHolderviewHolder=null;
finalintlocation=position;
if(convertView==null){
convertView=layoutInflater.inflate(R.layout.sublist_item,null);
viewHolder=newViewHolder();
viewHolder.textView=(TextView)convertView
.findViewById(R.id.textview1);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder)convertView.getTag();
}
viewHolder.textView.setText(cities[foodpoition][position]);
viewHolder.textView.setTextColor(Color.BLACK);
returnconvertView;
}
publicstaticclassViewHolder{
publicTextViewtextView;
}
}
对应的xml布局:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="aaaaa"
android:textSize="16dip"
android:layout_marginTop="10dip"
android:layout_marginLeft="8dip"
android:layout_marginBottom="8dip"/>
</LinearLayout>
最后看下主activity的实现代码
publicclassMainActivityextendsActivity{
privateMyListViewlistView;
privateMyListViewsubListView;
privateMyAdaptermyAdapter;
privateSubAdaptersubAdapter;
Stringcities[][]=newString[][]{
newString[]{"全部美食","本帮江浙菜","川菜","粤菜","湘菜","东北菜","台湾菜","新疆/清真","素菜","火锅","自助餐","小吃快餐","日本","韩国料理",
"东南亚菜","西餐","面包甜点","其他"},
newString[]{"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部购物","综合商场","服饰鞋包","运动户外","珠宝饰品","化妆品","数码家电","亲子购物","家居建材"
,"书店","书店","眼镜店","特色集市","更多购物场所","食品茶酒","超市/便利店","药店"},
newString[]{"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全","咖啡厅","酒吧","茶馆","KTV","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部","咖啡厅","酒吧","茶馆","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部休","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部休闲","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部休闲娱","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏"},
newString[]{"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
newString[]{"全部休闲aaa","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
"DIY手工坊","桌球馆","桌面游戏"},
};
Stringfoods[]=newString[]{"全部频道","美食","休闲娱乐","购物","酒店","丽人","运动健身","结婚","亲子","爱车","生活服务"};
intimages[]=newint[]{R.drawable.ic_category_0,R.drawable.ic_category_10,R.drawable.ic_category_30,R.drawable.ic_category_20
,R.drawable.ic_category_60,R.drawable.ic_category_50,R.drawable.ic_category_45,R.drawable.ic_category_50,R.drawable.ic_category_70,
R.drawable.ic_category_65,R.drawable.ic_category_80};
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
myAdapter=newMyAdapter(getApplicationContext(),foods,images);
listView.setAdapter(myAdapter);
selectDefult();
listView.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intposition,
longarg3){
//TODOAuto-generatedmethodstub
finalintlocation=position;
myAdapter.setSelectedPosition(position);
myAdapter.notifyDataSetInvalidated();
subAdapter=newSubAdapter(getApplicationContext(),cities,position);
subListView.setAdapter(subAdapter);
subListView.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,
intposition,longarg3){
//TODOAuto-generatedmethodstub
Toast.makeText(getApplicationContext(),cities[location][position],Toast.LENGTH_SHORT).show();
}
});
}
});
}
privatevoidinit(){
listView=(MyListView)findViewById(R.id.listView);
subListView=(MyListView)findViewById(R.id.subListView);
}
privatevoidselectDefult(){
finalintlocation=0;
myAdapter.setSelectedPosition(0);
myAdapter.notifyDataSetInvalidated();
subAdapter=newSubAdapter(getApplicationContext(),cities,0);
subListView.setAdapter(subAdapter);
subListView.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,
intposition,longarg3){
//TODOAuto-generatedmethodstub
Toast.makeText(getApplicationContext(),cities[location][position],Toast.LENGTH_SHORT).show();
}
});
}
}
默认我选中了第0个,下面看一下运行效果:
相关文章
- Android基于DataBinding封装RecyclerView实现快速列表开发
- android开机动画多长时间_Android开机动画原理分析
- 代码加密 android,Android 开发怎样做代码加密或混淆「建议收藏」
- android开发笔记之 Android代码混淆打包
- android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」
- 观察者模式及在Android源码中的应用
- android退出app代码,Android应用退出代码各种方式
- mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]
- android 获取收到短信验证码,Android自动获取短信验证码
- android登录注册跳转的代码_Android开发代码
- android调用相册并显示图片_Android获取相册列表
- Android SDK Tools_android.intent.category.DEFAULT
- 解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
- Android 数据库加密 android-database-sqlcipher 开源版本编译过程
- 【Android 安装包优化】7z 文件压缩格式 ( 7z 格式简介 | 7z 命令使用说明 )
- 【Android Gradle 插件】Gradle 基础配置 ③ ( 生成 Gradle Wrapper 配置 | 分析生成的 gradle-wrapper.properties 配置文件 )
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- Android控制文字水平间距android:letterSpacing详解手机开发
- [android] 请求码和结果码的作用详解手机开发
- Android Studio 导入项目 出现安装Error:Cause: failed to find target with hash string ‘android-23’ 等错误详解手机开发
- Realme Flash即将发布 首款具有磁性无线充电功能的Android手机
- Android开发旋转屏幕导致Activity重建解决方法
- 将文件放到Android模拟器的SD卡中的两种解决方法
- Android开发笔记之:一分钟学会使用Logcat调试程序的详解
- Android中自定义ContentProvider实例
- Android实现三级联动下拉框下拉列表spinner的实例代码
- android开发教程之textview内容超出屏幕宽度显示省略号