自定义列表视图,每行有两个按钮

时间:2011-07-12 17:35:27

标签: android listview

我花了两天的时间试图解决这个问题。如果有人能提供帮助,我会非常感激。

我想要实现的目标:

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

我取得的成就:

我有一个简单的数组适配器,当玩家在列表中添加新的玩家名称时,我会在其上运行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();
    }

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

问题:

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

如何提供帮助......?

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

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

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

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:1)

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

由于按钮的状态由适配器的getView方法管理,因此您的方法无效。即使你通过挖掘孩子来改变它们,下次调用getView方法时,它也会搞砸了。

答案 1 :(得分:1)

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

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

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

  • 如果您没有足够的数据来保证使用ScrollView,您也可以手动使用填充了少量行的ListView。这样你就不必担心你的行被回收了,按钮状态也没有了。

此外,您可能希望使用RadioGroup作为性别选择器(我无法想到更好地使用单选按钮,因为它们是互斥的。)

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

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