【问题标题】:Expanded List View is not working展开的列表视图不起作用
【发布时间】:2017-09-25 17:57:09
【问题描述】:

我正在尝试使用复选框制作Expanded List View,理想情况下用于设置。

但由于某种原因,它对我来说效果不佳。

我尝试了许多不同的教程并花了很多时间。但他们似乎都以同样的方式结束。它显示在我的活动中,但不会展开或折叠。

这是我的 settings.XML 代码:

<ExpandableListView
 android:id="@+id/lvExp"
 android:layout_height="match_parent"
 android:layout_width="match_parent"/>

这是我的父 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
android:background="#000000">


<TextView
    android:id="@+id/lblListHeader"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="?
    android:attr/expandableListPreferredItemPaddingLeft"
    android:textSize="17dp"
    android:textColor="#f9f93d" />

</LinearLayout>

这是我的子 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="55dip"
 android:orientation="vertical" >

<TextView
    android:id="@+id/lblListItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dip"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="?
    android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>

这是我的可扩展列表适配器

package com.example.edonfreiner.siddur;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;

public ExpandableListAdapter(Context context, List<String> 
listDataHeader,
                             HashMap<String, List<String>> 
listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return 
this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, 
ViewGroup parent) {

    final String childText = (String) getChild(groupPosition, 
childPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);

    txtListChild.setText(childText);
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return 
this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .size();
}

@Override
public Object getGroup(int groupPosition) {
    return this._listDataHeader.get(groupPosition);
}

@Override
public int getGroupCount() {
    return this._listDataHeader.size();
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    String headerTitle = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView
            .findViewById(R.id.lblListHeader);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);

    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) 
{
    return true;
}
}

到目前为止,我什至可以让它工作,更不用说在其中放置复选框了,我希望这更容易。

【问题讨论】:

  • 那么,您是否只看到列表中的父项? getChildrenCount() 的大小是多少?另外,我不明白复选框在哪里。
  • 是的,我只看到列表中的父项,我上传了一张图片,所以你可以看到,但请注意复选框不是可扩展列表视图的一部分,只是后面的 xml 复选框它。我还没有合并复选框。我想让您了解整个项目,以便您可以更好地为我提供帮助,或者也许有一种不同的方式可以一起实现这个想法。
  • 感谢您的帮助,问题是视图太小,一切正常,只是您看不到它。我也设法在那里获得了复选框,但是我无法让复选框侦听器工作。这是为什么?另外,有没有办法在某些东西打开和关闭时调整视图的大小?谢谢

标签: android xml android-layout expandablelistview android-checkbox


【解决方案1】:

我认为这可能是两个问题之一:要么 getChildrenCount 方法返回 0,要么某个视图获得焦点。尝试在父 XML 的容器布局中使用此代码:

android:descendantFocusability="blocksDescendants"

【讨论】:

  • 嘿,我记录了这个:getChildrenCount它返回 7。但是谢谢
  • 感谢您的帮助,问题是视图太小,一切正常,只是您看不到它。我也设法在那里获得了复选框,但是我无法让复选框侦听器工作。这是为什么?另外,有没有办法在某些东西打开和关闭时调整视图的大小?谢谢
【解决方案2】:

我已经意识到,当 ExpandableListView 的子元素可聚焦时(如按钮、复选框),您需要设置(在您的子元素上):

android:focusable="false"

这是因为这些子元素会从您的触摸中窃取焦点,从而扩展列表视图。

这最初是我对Android ExpandableListView not expanding 问题的回答,似乎帮助了一些人。

EDIT focusable 属性表示小部件可以接收不同于点击(按钮、复选框等接收)的焦点

【讨论】:

  • 感谢您的帮助@ucsunil,但这不是诀窍。另外,我想稍后当我想在其中放置复选框时,我需要将其设置为 true
  • 您是否尝试在 TextView 本身上设置它?我相信 TextView 是可聚焦的(因为如果您使用与接收点击不同的键盘,则可以获得焦点)。
  • 感谢您的帮助,问题是视图太小,一切正常,只是您看不到它。我也设法在那里获得了复选框,但是我无法让复选框侦听器工作。这是为什么?另外,有没有办法在某些东西打开和关闭时调整视图的大小?谢谢
  • 啊..您可能必须将 clickable 属性显式设置为 true。这是您很少需要使用的属性之一,但我记得我必须尝试使用​​这些属性才能使它们全部正常工作。
  • 我假设这是给子复选框的,对吗?设置可点击究竟是做什么的?现在它确实点击了,我只是不能为它设置一个监听器。另外,我可以检测它是否被点击,只是监听器部分不起作用
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2011-10-14
相关资源
最近更新 更多