【问题标题】:Dynamically Creating Multiple ListViews in Android在 Android 中动态创建多个 ListView
【发布时间】:2013-01-27 22:49:32
【问题描述】:

我目前正在开发一个基本的 android 新闻聚合应用程序,我知道那里有很多负载,但我基本上只是创建一个,因为我认为对于刚开始使用 Android 的人来说,这是一个很好的起点发展。

我的目标是显示来自多个提要的文章。每个提要都有自己的水平滑动列表,有点像脉冲新闻应用程序。到目前为止,我已经设法找到有关创建“Horizo​​ntalListView”的教程,现在我的应用程序显示了一个基本的水平滑动列表视图,如下所示:

截图链接:http://www.dev-smart.com/wp-content/uploads/2011/03/device-200x300.png

Pulse 应用截图: http://a1525.phobos.apple.com/us/r1000/080/Purple/v4/ba/6a/01/ba6a01d1-f0b7-4bb7-3f94-5a5761653e3c/mzl.zxnjzzmk.480x480-75.jpg

代码:

public class HorizontalListViewDemo extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.listviewdemo);

    HorizontalListView listview = (HorizontalListView) findViewById(R.id.listview);
    listview.setAdapter(mAdapter);


}

private static String[] dataObjects = new String[]{ "Text #1",
    "Text #2",
    "Text #3", "Text #4"  }; 

private BaseAdapter mAdapter = new BaseAdapter() {

    private OnClickListener mOnButtonClicked = new OnClickListener() {

        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(HorizontalListViewDemo.this);
            builder.setMessage("hello from " + v);
            builder.setPositiveButton("Cool", null);
            builder.show(); 
        }
    };

    @Override
    public int getCount() {
        return dataObjects.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewitem, null);
        TextView title = (TextView) retval.findViewById(R.id.title);
        Button button = (Button) retval.findViewById(R.id.clickbutton);
        button.setOnClickListener(mOnButtonClicked);
        title.setText(dataObjects[position]);
        return retval;
    }   
};
}

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"
>

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="#000"
  >

  <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="250dp"
    android:background="#ddd"
  />

</LinearLayout>
</ScrollView>

正如我所提到的,每个 Horizo​​ntalListView 将代表 1 个提要并显示其关联的文章,如上所示。因此,我在此开发中的下一步是尝试动态创建这些 Horizo​​ntalListView,以便用户可以在应用程序内声明一个提要,然后在已定义的提要下方动态创建它。

忽略该过程中涉及的所有其他努力,我实际上只是寻求帮助创建一个新的 Horizo​​ntalListView,它可以回收已定义的 XML listview 布局 id="listview"。我知道如果我在哪里预定义所有提要并创建具有唯一 id 的唯一 XML 布局,我可以让它工作,但我想知道有没有一种方法可以定义一个新的 Horizo​​ntalListView 来重用现有布局。

我希望你们能帮我解释一下。

谢谢

更新 1: 使用视图?

//Defining main XML file "listviewdemo.xml"
setContentView(R.layout.listviewdemo);
//Creating a new view to apply to my HorizontalListViews, /res/layout/listviewStyle.xml
View view = getLayoutInflater().inflate(R.layout.listviewStyle, null);

//Defining my first HorizontalListView      
HorizontalListView listview = (HorizontalListView) view.findViewById(R.id.listviewReuse);
listview.setAdapter(mAdapter);

【问题讨论】:

  • 我在阅读这个问题时有点迷失了。你熟悉“Inflater.inflate”吗?这将允许您在运行时加载布局并将其附加到父级。
  • 您好,您可以从here获得一些基本的想法。

标签: java android xml android-layout listview


【解决方案1】:
HorizontalListView listview = (HorizontalListView) findViewById(R.id.listview);

此行将始终返回使用 R.id.listview 找到的第一个视图。当你有多个列表视图时不是很好。

现在在子视图上调用 findViewById() 而不是调用 Activity.findViewById()。您可以在布局中包含每个列表视图。然后调用 findViewById 查找作为列表视图父级的布局。在布局上调用 findViewById。

一旦你第一次找到listView,记住它以备后用。

在您发布的更新代码中,删除此行。它没有做任何事情 b/c 这个视图不是布局 R.layout.listviewdemo 的一部分。

View view = getLayoutInflater().inflate(R.layout.listviewStyle, null);

然后在 R.layout.listviewdemo 的 xml 中将两个列表视图添加到同一个 .xml 中(假设这是您的目标)。无论如何,您可能应该将所有视图添加到同一布局,然后使用findViewById 检索视图。

【讨论】:

  • 是的,listview 的 XML 当前在 res/layout 下的 listview.xml 中定义。上面描述了确切的 XML。当我第一次开始使用列表视图时,我想我可以在定义新列表视图时重用已经定义的 XML id,即 Horizo​​ntalListView listview2 = (Horizo​​ntalListView)findViewById(R.id.listView);但是当我这样做时,第二个列表视图不会出现在我的应用程序中。如果我复制 listview XML 并应用一个新的 id,即 listview2 它确实会出现。所以我假设您只能使用任何 ID 一次?
  • 好吧,你肯定是根据那条评论误解了一些东西。 1) findViewById 将在布局中找到具有该 id 的第一个视图。如果您在一个布局中有 2 个列表视图,则不要在活动上调用 findViewById,而是在只有 1 个列表视图的子视图上调用它。 2)您不能调用 findViewById 并期望它创建第二个布局,您需要在布局中定义 2 个列表视图。
  • 是的,我肯定误解了一些东西,在再次查看我的代码后,我现在尝试使用第二个 XML 文件“listviewStyle.xml”中的 id 创建一个视图,该文件只有 1 个 id那就是listviewReuse。有关更多信息,请参阅相关更新。到目前为止,这会创建一个空白活动。 HorzListview 现在没有出现。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2019-11-17
相关资源
最近更新 更多