当前位置: 移动技术网 > IT编程>移动开发>Android > ListView点击Item展开菜单实现代码详解

ListView点击Item展开菜单实现代码详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

导师推荐意见,不良尤物,李先念的儿子

一、概述

listview点击item显示菜单是要实现这样的效果:

需要实现的逻辑如下:

1)点击一个普通item,展开当前菜单,同时关闭其他菜单

2)点击一个已展开的菜单,隐藏当前菜单

3)将展开菜单滑到listview之外,再滑动回来,展开菜单状态不变

4)点击菜单中的按钮,能够根据不同item进行不同的处理

二、实现思路

1、ui布局上,对于这种每个listitem都包含动态显示菜单的场景,可以直接在listitem的xml布局里就包含两部分元素:item本身以及展开菜单

点击item的时候,动态控制展开菜单这部分元素的visibility就可以了

2、逻辑控制上,需要额外记录当前展开菜单的item是谁,这样可以方便高效的实现概述中描述的逻辑

三、开始干活

实现的代码结构不复杂,这里直接贴代码了:

listview_menu.xml:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eeeeee"
android:orientation="vertical"
tools:context="${relativepackage}.${activityclass}" >
<listview
android:id="@+id/listview_menu_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null" />
</linearlayout>

listview_menu_item.xml:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/background_light"
android:orientation="vertical"
android:descendantfocusability="blocksdescendants" >
<textview
android:id="@+id/listview_menu_item_txt"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textstyle="bold"
android:textsize="20sp"
android:textcolor="@android:color/black"
android:text="123" />
<linearlayout
android:id="@+id/listview_menu_item_menu"
android:layout_width="match_parent"
android:layout_height="50dp"
android:visibility="visible"
android:orientation="horizontal" >
<button
android:id="@+id/listview_menu_item_menu_toast"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#8080ff"
android:textcolor="@android:color/black"
android:textsize="15sp"
android:text="提示" />
<button
android:id="@+id/listview_menu_item_menu_collapse"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#80ff80"
android:textcolor="@android:color/black"
android:textsize="15sp"
android:text="收起" />
</linearlayout>
</linearlayout>

listviewmenuactivity.java:

public class listviewmenuactivity extends activity {
private int mexpandedmenupos = -1;
private listviewadapter madapter;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.listview_menu);
arraylist<integer> data = new arraylist<integer>();
for (int index = 0; index != 40; ++index) {
data.add(index);
}
listview list = (listview)findviewbyid(r.id.listview_menu_list);
list.setadapter(madapter = new listviewadapter(this, data));
list.setonitemclicklistener(new onlistitemclicklistenser());
}
private class listviewadapter extends baseadapter {
private layoutinflater mlayoutinflater;
private arraylist<integer> mlistdata;
private onmenuclicklistenser monmenuclicklistenser = new onmenuclicklistenser();
private class viewholder {
public viewholder (view viewroot) {
root = viewroot;
txt = (textview)viewroot.findviewbyid(r.id.listview_menu_item_txt);
menu = viewroot.findviewbyid(r.id.listview_menu_item_menu);
btntoast = (button)viewroot.findviewbyid(r.id.listview_menu_item_menu_toast);
btncollapse = (button)viewroot.findviewbyid(r.id.listview_menu_item_menu_collapse);
}
public view root;
public textview txt;
public view menu;
public button btntoast;
public button btncollapse;
}
public listviewadapter(context context, arraylist<integer> data) {
mlayoutinflater = layoutinflater.from(context);
mlistdata = data;
}
@override
public int getcount() {
return mlistdata == null ? 0 : mlistdata.size();
}
@override
public object getitem(int position) {
return mlistdata == null ? 0 : mlistdata.get(position);
}
@override
public long getitemid(int position) {
return position;
}
@override
public view getview(final int position, view convertview, viewgroup parent) {
if (convertview == null) {
convertview = mlayoutinflater.inflate(r.layout.listview_menu_item, parent, false);
convertview.settag(new viewholder(convertview));
}
if (convertview != null && convertview.gettag() instanceof viewholder) {
final viewholder holder = (viewholder)convertview.gettag();
holder.txt.settext(string.valueof(getitem(position)));
if (position % 2 == 0) {
holder.root.setbackgroundcolor(0xffc9eefe);
} else {
holder.root.setbackgroundcolor(0xffffffff);
}
holder.menu.setvisibility(position == mexpandedmenupos ? view.visible : view.gone);
holder.btntoast.settext("提示" + position);
holder.btncollapse.settext("收起" + position);
holder.btntoast.setonclicklistener(monmenuclicklistenser);
holder.btncollapse.setonclicklistener(monmenuclicklistenser);
}
return convertview;
}
private class onmenuclicklistenser implements view.onclicklistener {
@override
public void onclick(view v) {
final int id = v.getid();
if (id == r.id.listview_menu_item_menu_toast) {
toast.maketext(listviewmenuactivity.this, "提示" + mexpandedmenupos, toast.length_short).show();
} else if (id == r.id.listview_menu_item_menu_collapse) {
mexpandedmenupos = -1;
notifydatasetchanged();
}
}
}
}
private class onlistitemclicklistenser implements onitemclicklistener {
@override
public void onitemclick(adapterview<?> parent, view view, int position, long id) {
if (position == mexpandedmenupos) {
mexpandedmenupos = -1;
} else {
mexpandedmenupos = position;
}
madapter.notifydatasetchanged();
}
}
}

四、demo视频

[转载请保留本文地址:

五、demo工程

保存下面的图片,扩展名改成 .zip 即可

以上所述是小编给大家介绍的listview点击item展开菜单实现代码详解的相关知识,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网