android expandablelistview横向,expandableListView 总结[通俗易懂]

android expandablelistview横向,expandableListView 总结[通俗易懂]实现效果图:expandableListViewgroupIndicator图片默认是在左边,而且比较难看,而我要的是实现groupIndicator在右边自定义图片,换图片最简单的就是直接copy系统@android:drawable/expander_group?android:attr/expandableListPreferredItemIndicatorLeft?android…

大家好,又见面了,我是你们的朋友全栈君。

实现效果图:

52dc348ef41efa8e9e10fca2c60dbfd9.png

expandableListView  groupIndicator 图片默认是在左边,而且比较难看,而我要的是实现groupIndicator 在右边自定义图片,

换图片

最简单的就是直接copy 系统

@android:drawable/expander_group

?android:attr/expandableListPreferredItemIndicatorLeft

?android:attr/expandableListPreferredItemIndicatorRight

@android:drawable/divider_horizontal_dark_opaque

看到这个没有

@android:drawable/expander_group

我们只要把这个给换了,那 groupIndicator也就跟着变了。但是改这个有个问题显示出来的

显示的效果不是很好,图片有被拉升过,系统自己是做了个.9图片。我们已可以

2.做一张.9图片

在你eclipse 的解压目录下,找到\sdk\tools\

我的是D:\android-IDE-eclipse-64\adt-bundle-windows-x86-20130522\sdk\tools

在这个目录下有一个draw9patch.bat的批处理文件。我们要用它做.9图,双击直接打开。直接将你要做成.9 的原图直接拉进工具。

3.创建 Indicator selector expander_group.xml 文件

android:state_expanded=”true”

android:drawable=”@drawable/up” />

android:drawable=”@drawable/down” />

4.放一张图片到你的res目录下这里我直接用系统的

@android:drawable/divider_horizontal_dark_opaque

这个是一张图片

5.在自己的style。xml里写一个

@drawable/expander_group

?android:attr/expandableListPreferredItemIndicatorLeft

?android:attr/expandableListPreferredItemIndicatorRight

@drawable/divider_horizontal_dark_opaque

这样我们就自己定义好了expandable的style

6.加载自己的style

android:id=”@+id/expandableListView1″

style=”@style/ExpandableListView”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:layout_alignParentLeft=”true”

android:layout_alignParentTop=”true” >

7.在activity中设置 Indicator位置

expandablelistView 提供一个方法设置位置

Display dp = getWindowManager().getDefaultDisplay();

int width = dp.getWidth();

lv.setIndicatorBounds(width-50, width);

运行完结果:

dc65fd5a901fbff3faff79b26b855efd.png

不知道什么原因还是有点拉伸,效果不是很好,但又要实现title图片不回被拉伸放大这样的效果;所以我就只能把图标给屏蔽了,然后在groupItem的布局加一个ImageView,用ImageView自己实现。

android:id=”@+id/exlv_select_binddev”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:groupIndicator=”@null”

android:childIndicator=”@null”

>

这样就把他自带的图标给屏蔽了,然后直接在groupitem布局加上一个ImageView,再做一个Childitem的布局,布局我直接设4个button,自由发挥了。

然后在适配器上getgroupView 设置父布局,在getChildView设置子布局。和listView的差不多。

现在要做的就是设置监听

监听ImageView expandableListView 的点击事件,这里我是点图片展开和关闭Child,长点击expandableListView 也展开和关闭Child,点击进入另一个界面。

监听ImageView的点击事件,这里关键是保存position。直接写一个内部类保存position

class ImageListener implements OnClickListener {

private int groupPosition;

public ImageListener(int groupPosition)

{

this.groupPosition = groupPosition;

}

@Override

public void onClick( View v )

{

Toast.makeText(ExpandableActivity.this, ” p_w_picpath groupPosition : ” + groupPosition, Toast.LENGTH_SHORT)

.show();

if (mlist.isGroupExpanded(groupPosition))//是否展开

{

mlist.collapseGroup(groupPosition);//设置关闭

}

else

{

mlist.expandGroup(groupPosition);//设置展开

}

}

}

监听长点击事件

mlist.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick( AdapterView> parent, View childView, int flatPos, long id )

{

if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(groupPosition + childPosition + ” :groupPosition childPosition” + flatPos + ” “

+ id);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

return true;

}

else if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(childPosition + ” :groupPosition”);

return true;

}

return false;

}

});

获取点击事件

mlist.setOnGroupClickListener(new OnGroupClickListener() {

@Override

public boolean onGroupClick( ExpandableListView parent, View v, final int groupPosition, long id )

{

Toast.makeText(ExpandableActivity.this, ” click groupPosition : ” + groupPosition + ” id : ” + id,

Toast.LENGTH_SHORT).show();

return true;

}

});

这样就可以了

Child 的点击事件那就比较简单了,直接和ImageView的点击事件一样处理,或者直接写死了,Child是横向的,也只有4个不多。

ch.tv_choose.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件进入

onChildChick(0, FatherItem);

}

});

public void onChildChick( int childItemid, int fatherItemid )

{

// TODO 接收child

Toast.makeText(this, ”  childItemid : ” + childItemid + ” fatherItemid : ” + fatherItemid, Toast.LENGTH_SHORT)

.show();

}

这样就搞定了

代码:package com.example.listviewanditemchick;

import java.util.List;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.database.DataSetObserver;

import android.graphics.drawable.Drawable;

import android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat;

import android.view.Display;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.BaseExpandableListAdapter;

import android.widget.ExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.ListAdapter;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemLongClickListener;

import android.widget.ExpandableListView.OnGroupClickListener;

import android.widget.ExpandableListView.OnGroupExpandListener;

public class ExpandableActivity extends Activity {

private ExpandableListView mlist;

private MyExpandableadapter madapter;

@Override

protected void onCreate( Bundle savedInstanceState )

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_expandable);

mlist = (ExpandableListView) findViewById(R.id.expandableListView1);

madapter = new MyExpandableadapter(this);

mlist.setAdapter(madapter);

Display dp = getWindowManager().getDefaultDisplay();

int width = dp.getWidth();

mlist.setIndicatorBounds(width – 50, width);

onClickExpandable();

}

private void onClickExpandable()

{

mlist.setOnGroupClickListener(new OnGroupClickListener() {

@Override

public boolean onGroupClick( ExpandableListView parent, View v, final int groupPosition, long id )

{

Toast.makeText(ExpandableActivity.this, ” click groupPosition : ” + groupPosition + ” id : ” + id,

Toast.LENGTH_SHORT).show();

return true;

}

});

//

mlist.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick( AdapterView> parent, View childView, int flatPos, long id )

{

if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(groupPosition + childPosition + ” :groupPosition childPosition” + flatPos + ” “

+ id);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

return true;

}

else if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(childPosition + ” :groupPosition”);

return true;

}

return false;

}

});

// 子菜单打开一个其他的就关闭

mlist.setOnGroupExpandListener(new OnGroupExpandListener() {

@Override

public void onGroupExpand( int groupPosition )

{

for (int i = 0; i < madapter.getGroupCount(); i++)

{

if (groupPosition != i)

{

mlist.collapseGroup(i);

}

}

}

});

}

public void onChildChick( int childItemid, int fatherItemid )

{

// TODO 接收child

Toast.makeText(this, ” childItemid : ” + childItemid + ” fatherItemid : ” + fatherItemid, Toast.LENGTH_SHORT)

.show();

}

public void onImageChick( int groupPosition )

{

Toast.makeText(ExpandableActivity.this, ” p_w_picpath groupPosition : ” + groupPosition, Toast.LENGTH_SHORT).show();

// if(isExpanded) p_w_picpath.setImageResource(R.drawable.up);

// else p_w_picpath.setImageResource(R.drawable.down);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

}

class ImageListener implements OnClickListener {

private int groupPosition;

public ImageListener(int groupPosition)

{

this.groupPosition = groupPosition;

}

@Override

public void onClick( View v )

{

Toast.makeText(ExpandableActivity.this, ” p_w_picpath groupPosition : ” + groupPosition, Toast.LENGTH_SHORT)

.show();

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

}

}

class MyExpandableadapter extends BaseExpandableListAdapter {

private Context context;

private int Imageposition;

private boolean expanded;

private int FatherItem;

public MyExpandableadapter(Context c)

{

this.context = c;

}

@Override

public int getGroupCount()

{

return 10;

}

@Override

public int getChildrenCount( int groupPosition )

{

return 1;

}

@Override

public Object getGroup( int groupPosition )

{

return null;

}

@Override

public Object getChild( int groupPosition, int childPosition )

{

return null;

}

@Override

public long getGroupId( int groupPosition )

{

return groupPosition;

}

@Override

public long getChildId( int groupPosition, int childPosition )

{

return childPosition;

}

@Override

public boolean hasStableIds()

{

return false;

}

public void setTitleImage( boolean isexpandeb )

{

}

@Override

public View getGroupView( int groupPosition, boolean isExpanded, View convertView, ViewGroup parent )

{

Imageposition = groupPosition;

groupHowd gh;

if (convertView == null)

{

gh = new groupHowd();

// convertView =

// LayoutInflater.from(context).inflate(R.layout.item, null);

convertView = LayoutInflater.from(context).inflate(R.layout.item_p_w_picpathbutton, null);

gh.p_w_picpath = (ImageView) convertView.findViewById(R.id.p_w_picpathButton1);

convertView.setTag(gh);

}

else

{

gh = (groupHowd) convertView.getTag();

}

expanded = isExpanded;

if (isExpanded)

gh.p_w_picpath.setImageResource(R.drawable.up);

else gh.p_w_picpath.setImageResource(R.drawable.down);

gh.p_w_picpath.setOnClickListener(new ImageListener(Imageposition));

return convertView;

}

@Override

public View getChildView( int groupPosition, int childPosition, boolean isLastChild, View convertView,

ViewGroup parent )

{

FatherItem = groupPosition;

childHowd ch;

if (convertView == null)

{

ch = new childHowd();

convertView = LayoutInflater.from(context).inflate(R.layout.selecte_exlv_item, null);

ch.tv_choose = (TextView) convertView.findViewById(R.id.tv_choose);

ch.tv_select = (TextView) convertView.findViewById(R.id.tv_select);

ch.tv_up = (TextView) convertView.findViewById(R.id.tv_up);

ch.tv_delete = (TextView) convertView.findViewById(R.id.tv_delete);

convertView.setTag(ch);

}

else

{

ch = (childHowd) convertView.getTag();

}

ch.tv_choose.setText(“进入”);

ch.tv_select.setText(“查看”);

ch.tv_up.setText(“修改”);

ch.tv_delete.setText(“删除”);

ch.tv_choose.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件进入

onChildChick(0, FatherItem);

}

});

ch.tv_select.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控键查看

onChildChick(1, FatherItem);

}

});

ch.tv_up.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件更新

onChildChick(2, FatherItem);

}

});

ch.tv_delete.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件你删除

onChildChick(3, FatherItem);

}

});

return convertView;

}

@Override

public boolean isChildSelectable( int groupPosition, int childPosition )

{

// TODO Auto-generated method stub

return true;

}

class groupHowd {

ImageView p_w_picpath;

TextView tv_name;

TextView tv_id;

TextView tv_state;

}

class childHowd {

TextView tv_choose;

TextView tv_select;

TextView tv_up;

TextView tv_delete;

}

}

}

groupView 布局:这里最好用relativeLayout,之前用linearlayout不能实现点击p_w_picpathView没反应回去不到事件,后面监听触摸事件,那做法更麻烦,后来改用relativelayout后就可以了。

然后设置 RelativeLayout 设置android:descendantFocusability=”blocksDescendants”

要获取点击事件的 ImageView设置 android:focusable=”false”就行了;<?xml version=”1.0″ encoding=”utf-8″?>

android:id=”@+id/LinearLayout1″

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:descendantFocusability=”blocksDescendants”

android:padding=”8dp” >

android:id=”@+id/p_w_picpathView1″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:src=”@drawable/ic_launcher” />

android:id=”@+id/textView1″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_alignTop=”@+id/p_w_picpathView1″

android:layout_marginLeft=”14dp”

android:layout_toRightOf=”@+id/p_w_picpathView1″

android:text=”Large Text”

android:textAppearance=”?android:attr/textAppearanceLarge” />

android:id=”@+id/textView2″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_alignBottom=”@+id/p_w_picpathView1″

android:layout_alignLeft=”@+id/textView1″

android:text=”TextView” />

android:id=”@+id/p_w_picpathButton1″

android:scaleType=”fitXY”

android:layout_width=”45dp”

android:layout_height=”45dp”

android:layout_alignBottom=”@+id/textView2″

android:layout_alignParentRight=”true”

android:src=”@drawable/down”

android:focusable=”false” />

Child布局:<?xml version=”1.0″ encoding=”utf-8″?>

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:descendantFocusability=”beforeDescendants”

android:orientation=”horizontal” >

android:id=”@+id/tv_choose”

android:layout_width=”wrap_content”

android:layout_height=”@dimen/p_w_picpath_height”

android:layout_weight=”1″

android:background=”@drawable/btn_selector_blue”

android:clickable=”true”

android:enabled=”true”

android:focusable=”true”

android:gravity=”center”

android:padding=”4dp”

android:text=”进入”

android:textColor=”@color/white”

android:textSize=”@dimen/fontxiao” />

android:id=”@+id/p_w_picpathView1″

android:layout_width=”2dp”

android:layout_height=”@dimen/p_w_picpath_height”

android:background=”@color/black” />

android:id=”@+id/tv_select”

android:layout_width=”wrap_content”

android:layout_height=”@dimen/p_w_picpath_height”

android:layout_weight=”1″

android:background=”@drawable/btn_selector_blue”

android:clickable=”true”

android:enabled=”true”

android:focusable=”true”

android:gravity=”center”

android:padding=”4dp”

android:text=”查看”

android:textColor=”@color/white”

android:textSize=”@dimen/fontxiao” />

android:id=”@+id/p_w_picpathView1″

android:layout_width=”2dp”

android:layout_height=”@dimen/p_w_picpath_height”

android:background=”@color/black”/>

android:id=”@+id/tv_up”

android:layout_width=”wrap_content”

android:layout_height=”@dimen/p_w_picpath_height”

android:layout_weight=”0.96″

android:background=”@drawable/btn_selector_blue”

android:clickable=”true”

android:enabled=”true”

android:focusable=”true”

android:gravity=”center”

android:padding=”4dp”

android:text=”修改”

android:textColor=”@color/white”

android:textSize=”@dimen/fontxiao” />

android:id=”@+id/p_w_picpathView1″

android:layout_width=”2dp”

android:layout_height=”@dimen/p_w_picpath_height”

android:background=”@color/black”/>

android:id=”@+id/tv_delete”

android:layout_width=”wrap_content”

android:layout_height=”@dimen/p_w_picpath_height”

android:layout_weight=”1″

android:background=”@drawable/btn_selector_blue”

android:clickable=”true”

android:enabled=”true”

android:focusable=”true”

android:gravity=”center”

android:padding=”4dp”

android:text=”删除”

android:textColor=”@color/white”

android:textSize=”@dimen/fontxiao” />

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149165.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午11:31
下一篇 2022年6月16日 下午11:31


相关推荐

  • sublime text3 激活码_在线激活「建议收藏」

    (sublime text3 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    84
  • 清除挖矿脚本 minerd[通俗易懂]

    清除挖矿脚本 minerd[通俗易懂]症状:cup占用率飙高原因:这次入侵是由于redis没有设置用户名密码,没有限制访问ip导致 解决方法:ps-eopcpu,args–sort=%cpu|head  找到飙高的程序是minerdTOP查看minerd的pidkill-s9pid(pid的值每个服务器不同)rm-rf /var/spool/cron/cronta

    2022年7月13日
    24
  • SQLyog使用技巧

    SQLyog使用技巧1 自动填充 2 sql 添加到收藏夹 以便下次使用 3 通过历史记录获取操作相关表的 sql 语句通过 SQLyog 工具创建和修改表结构时 创建和修改表结构的 sql 语句可以通过 SQLyog 的历史记录查看 无需自己写 sql 语句哦 查看 SQlyog 的快捷键 CTRL SHIFT H4 有子查询时 单独执行子查询有多个子查询时 确保整个 sql 执行正常 需要确保每个子查询的数据正

    2026年3月17日
    2
  • 分布式事务TCC框架-hmily(spring cloud feign)

    分布式事务TCC框架-hmily(spring cloud feign)官网案例:文档(springcloud):https://dromara.org/zh/projects/hmily/user-springcloud/官网示例:https://github.com/dromara/hmily/tree/master/hmily-demo/hmily-demo-springcloud本示例:https://codechina.csdn.net/wwwzhouzy/zhouzy-hmily一、说明hmily是一个高性能异步分布式事务TCC框架,具有以下..

    2022年5月21日
    119
  • 如何理解web安全——同源策略

    如何理解web安全——同源策略什么是同源策略 nbsp nbsp 浏览器同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行狡猾 nbsp nbsp nbsp 同源策略是浏览器的一个安全功能 不同源的客户端脚本在没有明确授权的情况下 不能读写对方资源 只有同一个源的脚本赋予 dom 读写 cookie session ajax 等操作的权限 url 由协议 域名 端口和路径组成 如果两个 url 的协议 域名和端口相同 则这两个 url 是同源的 限制来源不用源的

    2026年2月18日
    3
  • docker部署influxdb

    docker部署influxdb使用 docker 部署 influxdbdock compose yamlversion 3 services influxdb image influxdb latestcontai name influxdbenvi INFLUXDB DB db0 INFLUXDB ADMIN ENABLED true INFLUXDB ADMIN USER admin INF

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号