3

在 Android 中,我有一个 Section 的 ArrayList(有一个 Section 类,所以它不仅仅是一个字符串的 ArrayList)。我想将每个部分表示为一个按钮。目前,我通过遍历每个 Section、膨胀 section.xml,然后动态添加随每个特定 Section 变化的属性来实现这一点:

SectionsActivity.java:

public class SectionsActivity extends Activity {

    private int numSections;
    LayoutInflater inflater;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sections);

        numSections = App.Sections.getSectionList().size();
        inflater = getLayoutInflater();

        LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
        for (int i = 0; i < numSections; i++) {
            ll.addView(getSectionButton(App.Sections.getSectionList().get(i)));
        }
    }

    public Button getSectionButton(Section s) {
        Button b = (Button) inflater.inflate(R.layout.section, null);
        b.setHint("section" + s.getSectionId());
        b.setText(s.getName());
        b.setTextColor(Color.parseColor("#"+s.getColor()));
        return b;
    }

}

Sections.java:

public class Sections {

    private ArrayList<Section> SectionList;

    public ArrayList<Section> getSectionList() {
        return SectionList;
    }

    public void setSectionList(ArrayList<Section> sectionList) {
        SectionList = sectionList;
    }

}

节.java:

public class Section {

    private String Color;
    private String Name;
    private int SectionId;

    //constructor, standard getters and setters

}

节.xml:

<?xml version="1.0" encoding="utf-8"?>

<Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold" />

这很好用,但我觉得可能有更好的解决方案。这是用于 Windows Phone 7 的 .NET 中的示例:您告诉 XAML 您想要绑定什么(SectionList,它是一个ObservableCollection),然后为它提供一个模板,说明集合中的每个项目应如何表示。

<StackPanel Name="StackPanelSection">
    <ListBox Name="ListBoxSection" ItemsSource="{Binding SectionList}" ScrollViewer.VerticalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name, Converter={StaticResource StringToLowercaseConverter}}" FontFamily="Segoe WP SemiLight" FontSize="48" Foreground="{Binding HTMLColor}" Tap="TextBlockSection_Tap" />
                </StackPanel>
            </DataTemplate>
         </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

这样更好,既简单又方便,如果您更改 SectionList 的内容,UI 会自动更新。我已经阅读了足够多的关于 Android 中的数据绑定的内容,知道可能没有真正的等价物,但是完成相同任务的最佳方法是什么?有吗?即使数据绑定在这里不是一个好的解决方案,我应该以不同的方式构建我的 Android 代码吗?

4

1 回答 1

1

您可以在 XAML 中获得该绑定,因为它已融入框架。您的应用程序在支持绑定查找的运行时环境中执行,因此您可以从 Microsoft 获得一个完整的绑定框架作为工具集的一部分。Android只是没有这种东西。

我不知道有一种方法可以像在 XAML 中那样以声明性方式进行绑定,但是在类似的船上(从 WPF/.Net/XAML 背景进入 Android),我找到了创造性的方法使它更方便。看起来你在这条路上进展顺利。我将自定义适配器用于我使用的任何列表或网格,它们提供了类似的便利……不像 xaml 绑定那样方便,但仍然很酷。

我没有看到你的 UI,所以我只能从你的代码中做出假设,但我只能假设你正在做的事情(LinearLayout 中的按钮)可以通过 ListView 和自定义适配器来完成。可能最经典的 Android 开发者视频是来自过去 Google I/O 的 ListView 世界。它已经有几年历史了,但仍然是一块很棒的手表,而且仍然很重要。

https://www.youtube.com/watch?v=wDBM6wVEO70

于 2012-10-12T22:31:29.703 回答