Android 每行有两个按钮的自定义listview

Android 每行有两个按钮的自定义listview,android,listview,Android,Listview,我花了两天时间试图解决这个问题。如果有人能帮忙,我将不胜感激 我正在努力实现的目标: 有一个列表视图,玩家可以通过一个文本字段(玩家名称)然后一个提交按钮添加新条目(玩家)。在ListView的每个字段中,我显示播放器名称,然后显示两个ImageButton。一个有男性标志,一个有女性标志。默认情况下切换男性符号,用户可以通过切换男性按钮或女性按钮将播放器设置为男性或女性。最后,一旦用户进入下一个屏幕(一个新活动),应用程序将把玩家姓名和附加的性别保存到某种形式的存储中,并继续进行下一个活动 我

我花了两天时间试图解决这个问题。如果有人能帮忙,我将不胜感激

我正在努力实现的目标:

有一个列表视图,玩家可以通过一个文本字段(玩家名称)然后一个提交按钮添加新条目(玩家)。在ListView的每个字段中,我显示播放器名称,然后显示两个ImageButton。一个有男性标志,一个有女性标志。默认情况下切换男性符号,用户可以通过切换男性按钮或女性按钮将播放器设置为男性或女性。最后,一旦用户进入下一个屏幕(一个新活动),应用程序将把玩家姓名和附加的性别保存到某种形式的存储中,并继续进行下一个活动

我所取得的成就:

我有一个简单的数组适配器,当播放器向列表中添加新的播放器名称时,我会在其上运行notifyDataSetChanged()。适配器还设置为使用自定义行布局文件。在布局文件中,它如下所示:

<?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">
    <RelativeLayout android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:id="@+id/relativeLayout1" android:layout_marginTop="5dp">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/playerName"
            android:layout_centerVertical="true" android:text="Derp" android:textStyle="bold" android:layout_marginLeft="5dp" android:textSize="22dp" android:textColor="@color/male_blue"></TextView>
        <ImageButton android:layout_height="60dp"
            android:layout_width="60dp" android:onClick="maleClickHandler"
            android:src="@drawable/male_icon_settings" android:id="@+id/buttonA" android:layout_alignParentRight="true" android:layout_marginRight="65dp"></ImageButton>
        <ImageButton android:onClick="femaleClickHandler"
            android:layout_height="60dp" android:layout_width="60dp" android:id="@+id/buttonB"
            android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/female_icon_settings"></ImageButton>
    </RelativeLayout>
</LinearLayout>
我还没有在这两个按钮之间实现任何互连,一次只允许一个按钮处于活动状态,甚至不允许一个按钮处于活动状态,因为我认为我可能采取了完全错误的方法

问题:

在向列表添加新条目时,在切换一个和/或其他公/母按钮后,事情变得非常混乱,公/母切换图标可能会随着附加的播放器字符串移动,或者更可能的是,被切换的图标会停留在第一行(列表的数组位置0),或者甚至移动到第二个列表位置,并在切换到上面的行时复制自己

你能如何帮助…?

我在屏幕下方附上了一张来自模拟器的图片,以帮助说明我的观点

我想我可能需要使用某种形式的自定义适配器;关于这个问题,我已经读了很多书,但是我找不到任何与我正在努力实现的目标相关的东西,所以如果你能给我指出正确的方向,或者甚至试着为这类问题找到最基本的解决方案,我将非常感激

最后,当我开始工作时,哪种存储形式最适合存储玩家姓名及其性别?我希望用户能够在退出应用程序并重新启动后保留播放器列表


谢谢你的帮助!:)

您需要使用一个自定义适配器,它本身应该能够跟踪每个条目的阳性/阴性标志


您的方法将无法工作,因为按钮的状态由适配器的getView方法管理。即使您通过挖掘子对象来更改它们,下次调用getView方法时,它也会把事情搞砸。

这在很大程度上取决于您希望在游戏中拥有多少玩家。如果一个数字可能适合一个屏幕(或非常接近),那么
列表视图实际上是不必要的
ListView
s和适配器并不是一种真正方便的方法,而是一种提高性能的工具。它们只在内存中保存屏幕上的内容,并在滚动时为新行回收旧的、已经显示的
View
s,这就是为什么一些按钮状态被复制到不同行的原因

有几种方法可以解决此问题:

  • 您可以按照Kumar Bibek的建议自己编写一个自定义适配器。在这个适配器中,您需要重写
    getView()
    方法,以确保每次调用该方法时每个按钮都具有正确的状态

  • 如果没有足够的数据来保证使用
    列表视图
    ,您也可以简单地使用手动填充了几行的
    滚动视图
    。这样,你就不必担心你的行被回收,按钮状态也不再古怪

此外,您可能希望研究使用
RadioGroup
作为性别选择器(我想不出单选按钮有什么更好的用途,因为它们是互斥的)

此外,行XML文件中的外部
LinearLayout
看起来没有必要


至于存储,您可以使用SQLite数据库或
SharedReferences
SharedReferences
不需要设置,但我觉得SQLite数据库更适合您的需要。

非常感谢,我想我会听取广播组的建议,并提供一个滚动视图。非常感谢很欢迎你。当您收到满意的答案时,应始终通过单击旁边的空复选标记将其标记为正确答案。一旦您提出了一些问题,您的“接受百分比”将显示在您的用户徽章中,高百分比将鼓励其他人为您提供高质量的答案。:)谢谢你,我怀疑我必须按照这些思路去做;感谢您完美地澄清了这一点:)
public void maleClickHandler(View v) {

        RelativeLayout vwParentRow = (RelativeLayout) v.getParent();
        ImageButton maleButton = (ImageButton) vwParentRow.getChildAt(1);
        maleButton.setImageDrawable(getResources().getDrawable(
                R.drawable.male_icon_selected));
        vwParentRow.refreshDrawableState();
    }

    public void femaleClickHandler(View v) {

        RelativeLayout vwParentRow = (RelativeLayout) v.getParent();
        ImageButton femaleButton = (ImageButton) vwParentRow.getChildAt(2);
        femaleButton.setImageDrawable(getResources().getDrawable(
                R.drawable.female_icon_selected));
        vwParentRow.refreshDrawableState();
    }