zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android二级listview列表实现代码

Android列表代码 实现 二级 listview
2023-06-13 09:14:43 时间
今天来实现以下大众点评客户端的横向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个,下面看一下运行效果: