getChildView 没有被调用

2023-11-25

我正在制作一个包含自定义 ExpandableListView 适配器的菜单。尽管尝试将我的代码与 API 示例和我在网上看到的任何其他示例(包括多个密切相关的 SO 问题)进行匹配,但我仍然无法使其工作。

我知道正在使用适配器,因为正在显示组视图(由 xml 组成)。单击组项也会调用“getGroupView”,但代码永远不会运行“getChildView”、“getChild”或“getChildId”。

我什至浏览了 Android-15 源代码以找出我可能做错了什么,但没有出现任何奇怪的情况。

= 基础活动

public class SettingsM extends FragmentActivity
{
    static Context context;
    ViewPager mViewPager;
    CollectionPagerAdapter mDemoCollectionPagerAdapter;
    //ColorPicker picker;

    SharedPreferences preferences;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

        context = this;
        // Set up action bar.
        final ActionBar actionBar = getActionBar();

        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setTitle("Particle emitter settings");

        // get the preferences for this screen
        preferences = this.getSharedPreferences("base_world", 0);

        // tab holder
        setContentView(R.layout.tabmenu_holder);
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mDemoCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);
    }

    public class CollectionPagerAdapter extends FragmentStatePagerAdapter
    {
        public CollectionPagerAdapter(FragmentManager fm) 
        {
            super(fm);
        }

        @Override
        public Fragment getItem(int i)
        {
            Fragment fragment = new TabFragment();
            Bundle args = new Bundle();
            if(preferences != null)
                {
                if(i == 0)
                {// world
                    args.putBoolean("world", true);
                } else
                {// emitter
                    args.putBoolean("world", false);
                    args.putInt("emitter", i-1);
                }
            }
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public int getCount()
        {
            return 100;
        }

        @Override
        public CharSequence getPageTitle(int position) 
        {
            if(position == 0)
            {
                return "World";
            } else
            {
                return "Emitter #" + position;
            }
        }
    }

    public static class TabFragment extends Fragment
    {        
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            Bundle args = getArguments();
            View rootView = new TextView(context);// use a textview as the default

            if(args.getBoolean("world"))
            {
                rootView = inflater.inflate(R.layout.m_backdrop, container, false);

                // add face drop-down
                ExpandableListView face_list = (ExpandableListView) rootView.findViewById(R.id.FaceList);
                if(face_list != null)
                {
                    face_list.setAdapter(new ExpandableFaceList(context));
                    face_list.setOnGroupClickListener(new OnGroupClickListener()
                    {

                        @Override
                        public boolean onGroupClick(ExpandableListView parent,
                            View v, int groupPosition, long id)
                        {
                            Log.i("FaceList", "Clicked:" + groupPosition);
                            return false;
                        }
                    });
                }

            } else
            {
                return rootView;
            }
            return rootView;
        }
    }
}

= 可扩展列表视图适配器

public class ExpandableFaceList extends BaseExpandableListAdapter implements ExpandableListAdapter
{
    public Context context;
    private LayoutInflater inflator;
    private float mDensity = 1f;

    private boolean bShowSw = true;
    private ColorPickerMenuView cp;
    private Switch sw;


    public ExpandableFaceList(Context context)
    {
        this.context = context;
        this.inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        mDensity = context.getResources().getDisplayMetrics().density;
    }

    @Override
    public int getGroupCount()
    {
        return 1;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return 6;// because there are 6 faces to a cube
    }

    // list views
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent)
    {
        View v = convertView;
        TextView tv;

        if(v == null)
        {
            v = inflator.inflate(R.layout.exlist_head, parent, false);

            tv = (TextView) v.findViewById(R.id.exList_Title);
            if(tv != null)
                tv.setText("Face Colors");

            tv = (TextView) v.findViewById(R.id.exList_Summary);
            String s_text = "The color for each face, click to ";
            s_text += ((isExpanded)? "collaspe": "expand");
            if(tv != null)
                tv.setText(s_text);
        } else
        {
            tv = (TextView) v.findViewById(R.id.exList_Summary);
            String s_text = "The color for each face, click to ";
            s_text += ((isExpanded)? "collaspe": "expand");
            if(tv != null)
                tv.setText(s_text);
            parent.invalidate();
        }        

        return v;
    }

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

        if(v == null)
        {
            if(bShowSw)
            {
                v = (LinearLayout) inflator.inflate(R.layout.face_info_sw, parent, false);
            } else
            {
                v = (LinearLayout) inflator.inflate(R.layout.face_info, parent, false);
            }
        }

        switch(childPosition)
        {
        case 0:
            v.setTag("Front");
            break;
        case 1:
            v.setTag("Back");
            break;
        case 2:
            v.setTag("Left");
            break;
        case 3:
            v.setTag("Right");
            break;
        case 4:
            v.setTag("Top");
            break;
        case 5:
            v.setTag("Bottom");
            break;
            }

        Log.i("ELV", "Pos:" + childPosition);

        cp = (ColorPickerMenuView) v.findViewById(R.id.face_color);
        cp.setTitle((String) v.getTag());

        cp.setOnClickListener(new OnClickListener() {
            public void onClick(View v) { UpdateData(v); }
        });

        if(bShowSw)
        {
            sw = (Switch) v.findViewById(R.id.face_sw);
            sw.setOnClickListener(new OnClickListener() {
                public void onClick(View v) { UpdateData(v); }
            });
        }

        return v;
    }

    private void UpdateData(View v) { }

    @Override
    public Object getGroup(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        return "Child:" + groupPosition + "." + childPosition;
    }

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

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

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

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

= Activity 的 xml 视图

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:textColor="#fff"
        android:paddingTop="4dp"
        android:paddingBottom="4dp" />

</android.support.v4.view.ViewPager>

= m_backdrop.xml(背景设置菜单)

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:app="http://schemas.android.com/apk/res/com.zyphronics.aquafinger">

      <RelativeLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical" >

            <TextView
            android:id="@+id/Title_GeneralSettings_text"
            style="?android:attr/listSeparatorTextViewStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dip"
            android:text="General Settings" />

        <ExpandableListView
            android:id="@+id/FaceList"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/Title_GeneralSettings_text" >
        </ExpandableListView>

        </RelativeLayout>

</ScrollView>

=face_info.sw.xml(face_info.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" >

    <Switch
        android:id="@+id/face_sw"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:tag="face_sw"
        android:text="Enabled?"
        android:textOff="No"
        android:textOn="Yes" />

    <com.zyphronics.AF.Controls.colorpicker.ColorPickerMenuView
        android:id="@+id/face_color"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:tag="face_color" />
</LinearLayout>

即使在face_info_sw.xml 中没有“ColorPickerMenuView”部分,子视图仍然不会被调用。我还尝试过单独使用相对布局,而不是在滚动视图中,但这阻止了进一步添加的项目滚动到(并且还使自定义控件具有奇怪的尺寸)。

任何解决这个问题的帮助都会很棒。如果有人需要这个的打包源(与 eclipse 兼容),如评论中所示,我将用链接回复。


问题是,您的 ExpandableListView 位于 ScrollView 中。大多数情况下,这是不良布局的结果,您应该尽量避免它。

然而,有时它是唯一的解决方案(这实际上不是真的,但其他解决方案可能超出了其范围)。您的解决方案也有效,但有点复杂。相反,编写一个自定义 ExpandableListView,如下所示:

public class ExpandExpandableListView extends ExpandableListView{
    boolean expanded = true;

    public ExpandExpandableListView(Context context) {
        super(context);
    }

    public ExpandExpandableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ExpandExpandableListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded()
    {
        return expanded;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (isExpanded())
        {
            // Calculate entire height by providing a very large height hint.
            // View.MEASURED_SIZE_MASK represents the largest height possible.
            int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        }else{
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded)
    {
        this.expanded = expanded;
    }
}

在你的 m_backdrop.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    ...    

      <RelativeLayout
         ...

        <com.package.name.to.class.ExpandExpandableListView
            android:id="@+id/FaceList"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/Title_GeneralSettings_text" >
        </ExpandableListView>

        </RelativeLayout>

</ScrollView>

已经是这样了。它应该按预期工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getChildView 没有被调用 的相关文章

  • 计算Android设备的PPI

    如何计算 Android 设备的 PPI 最特别的是 Android 平板电脑 请注意 我想计算设备的 PPI 而不是 DPI 就像一二三一样简单 让我们来计算一下PPI to Nexus 5 例如 float LCD Diagonal 4
  • 使用 google Directions API 的地图视图绘制方向 - 解码折线

    我正在尝试使用 Google 方向 API 在我的地图视图上显示方向 但我在从 JSON 响应获取数据时遇到困难 我可以获得 级别 和 点 字符串 但无法弄清楚如何将它们解码为地图上的点 任何帮助将非常感激 我有一个类可以为您解码它们 添加
  • 自定义选择器活动:SecurityException UID n 无权 content:// uri

    我正在构建一个选择器应用程序来替换本机 Android 共享对话框 它工作正常 除非我尝试通过长按图像 gt 共享图像从 Chrome 共享图像 我发现 Google 没有捕获异常 它崩溃了 所以我可以通过 Logcat 查看它 在 Goo
  • 使用 ADB 命令获取 IMEI 号码 Android 12

    对于 11 之前的 Android 版本 我使用以下命令从我的设备获取 IMEI 号码 adb shell service call iphonesubinfo 4 cut c 52 66 tr d space or adb shell s
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • Android 自定义布局 - onDraw() 永远不会被调用

    public class MainActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedI
  • Android Library项目使用gradle在命令行编译时无法导入另一个库项目的R类

    我的 android 项目有这样的结构 ProjectDir settings gradle MyApp depends on LibraryA and LibraryB gt build gradle gt All the other a
  • 如何在android中设置权限WRITE_SECURE_SETTINGS? [复制]

    这个问题在这里已经有答案了 我正在尝试启用 4 0 以上的辅助功能服务设置 但它显示异常 即 引起原因 java lang SecurityException 权限拒绝 写入安全设置需要 android permission WRITE S
  • 如何在手机缓存中保存用户名和密码

    我有一个用户登录应用程序 它需要用户的电子邮件和密码 我想将电子邮件和密码保存在手机缓存中 以便用户不必再次输入 有什么办法可以将数据保存在Android缓存中吗 我认为你需要使用SharedPreference用于在设备中使用应用程序时保
  • Android 应用程序中的 Eszett (ß)

    我的 res layout activity 文件中的德语 字符在我的应用程序中自动转换为 ss 即使我将语言和键盘设置为德语 它仍然不会显示 Android 中可以显示 吗 edit
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • 如何检查用户在EditText中输入自己的电话号码?

    用户将在我的 Android 应用程序的注册页面上的编辑文本中输入手机号码 如何检查用户输入的是他 她的手机号码而不是其他人的 我试过这个 TelephonyManager tMgr TelephonyManager mAppContext
  • 如何检查 Android 中连接的 wifi 网络是否处于活动状态

    如何自动检查android中连接的WiFi网络上的互联网是否处于活动状态 我可以检查 wifi 是否已启用或 wifi 网络是否已连接 但我不确定如何检查互联网是否已连接 这可能吗 private boolean connectionAva
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 使用 JobScheduler API 进行位置更新

    下面是我使用 FireBaseJobDispatcher 启动作业的演示代码 public class MainActivity extends AppCompatActivity Override protected void onCre

随机推荐