【问题标题】:Custom listview with two buttons in each row自定义列表视图,每行有两个按钮
【发布时间】:2011-07-16 13:38:52
【问题描述】:

我花了两天时间试图解决这个问题。如果有人可以提供帮助,我将不胜感激。

我想要达到的目标:

有一个 ListView,玩家可以通过一个文本字段(用于玩家名称)添加新条目(玩家),然后是一个提交按钮。在 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>

每行上的两个按钮引用类文件中的方法。这是我的代码:

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();
    }

我还没有实现这两个按钮之间的任何互连,一次只允许一个处于活动状态,或者甚至取消切换一个,因为我认为我可能完全采取了错误的方法。

问题:

在列表中添加新条目时,之后切换一个和/或其他男性/女性按钮,事情变得非常有问题,男性/女性切换图标可能会随着它应该移动使用附加的播放器字符串,或者更有可能的是,那些被切换的将留在第一行(列表的数组位置 0),甚至移动到第二个列表位置,并将自己复制为被切换到上面的行。

您能提供什么帮助...?

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

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

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

感谢您的帮助! :)

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我怀疑我必须按照这些思路做点什么;感谢您精美地澄清这一点:)
    【解决方案2】:

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

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

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

    • 如果您没有足够的数据来保证使用ListView,您也可以简单地使用手动填充几行的ScrollView。这样您就不必担心行被回收和按钮状态不正常。

    此外,您可能想考虑使用RadioGroup 作为性别选择器(我想不出更好的单选按钮用途,因为它们是互斥的)。

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

    就存储而言,您可以使用 SQLite 数据库或SharedPreferencesSharedPreferences 不需要设置,但我觉得 SQLite 数据库更适合您的需求。

    【讨论】:

    • 非常感谢,我想我会听取您对 Radio Group 的建议,以及一个 ScrollView。非常感谢! :D
    • 不客气。当您收到满意的答案时,您应始终通过单击旁边的空白复选标记将其标记为正确答案。一旦您提出了几个问题,您的“接受百分比”就会显示在您的用户徽章中,并且较高的百分比会鼓励其他人为您提供高质量的答案。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多