【问题标题】:How to fill a ListView in Android with data that comes from an external file and not from res/values/strings.xml file如何使用来自外部文件而不是来自 res/values/strings.xml 文件的数据填充 Android 中的 ListView
【发布时间】:2014-01-30 17:01:47
【问题描述】:

我想在一个安卓应用程序中创建一个列表视图

数据存储在外部 xml 文件中,位于 assets 文件夹中。

外部 xml 文件:

<root>
    <category> books </category>
         <item>
              <title> book Title1 </title>
         </item>
         <item>
              <title> book Title2 </title>
         </item>
         <item>
              <title> book Title3</title>
         </item>
     <category> movies </category>
         <item>
              <title> Title1 </title>
         </item>
         <item>
              <title> Title2 </title>
         </item>
         <item>
              <title> Title3</title>
         </item>
</root>

我想创建一个包含所有书名的 ListView

例如

book Title1
book Title2
book Title3 etc

第一步是使用 DOM 解析器来解析外部 xml 文档并使用 xpath 获取所有书籍的标题。(我已经这样做了)

第二步是用这些值填充 ListView(我没有这样做,因为我不知道哪种方法是最好的方法)

我在网上阅读了一些示例,在此示例中,数据存储在 strings.xml 文件中。 就我而言,数据是动态的,来自关系数据库并存储在 xml 文件中。

我是 android 新手,希望得到您的建议。

我不知道将来自外部 xml 文件的数据存储在哪里,以便在 Android 中填充 ListView。

谢谢

【问题讨论】:

    标签: android xml android-listview


    【解决方案1】:

    一些代码怎么样?下面的代码假定使用 Fragments,但您应该能够对其进行调整(双关语)以用于任何旧的直接活动:

    听起来每个 ListView 项目都有两个要显示的属性:

    • 类别
    • 标题

    所以,模型对象可能看起来像:

    public class MyItem {
      private String mCategory;
      private String mTitle;
      public String getCategory() {
        return mCategory;
      }
      // Plus other getters/setters.....
    }
    

    如果您想显示多个字段,您可以使用自定义布局,将其放入 res/layout(我们称之为 list_item_myitems.xml):

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
    
        <TextView
            android:id="@+id/list_item_categoryTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:textStyle="bold" />
    
        <TextView
            android:id="@+id/list_item_titleTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"/>
    
    </RelativeLayout>
    

    使用 Fragments 时,上面的布局将在 &lt;FrameLayout&gt; 内膨胀。如果您不使用 Fragments,请在您的活动布局 XML 中的 &lt;ListView&gt; 元素下方包含上面的两个 &lt;TextView&gt; 项目。

    接下来,如何使用自定义适配器类来处理呈现为每个 ListView 项显示的视图?

    public class MyItemAdapter extends ArrayAdapter<MyItem> {
    
      public MyItemAdapter(Activity activity, ArrayList<MyItem> items) {
        super(activity, 0, items);
      }
    
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
        View ret;
        if (convertView == null) {
          convertView = getActivity().
            getLayoutInflater().
            inflate(R.layout.list_item_myitems, null);
        }
    
        MyItem item = getItem(position);
    
        TextView dateTextView = 
          (TextView)convertView.findViewById(R.id.list_item_categoryTextView);
        dateTextView.setText(item.getCategory());
    
        TextView titleTextView =     
          (TextView)convertView.findViewById(R.id.list_item_titleTextView);
        titleTextView.setText(item.getTitle());
    
         ret = convertView;
         return ret;
       }
    
    
    }
    

    在您的 ListFragment 子类(或 Activity 子类 - 可能是 ListActivity 子类)中,创建上面的自定义适配器(确保传递您要显示的项目集合)并调用 setListAdapter(...)。

    玩得开心!

    【讨论】:

      【解决方案2】:

      解析您的数据并将其存储到ArrayList,然后将BaseAdapter 用于您的ListView

      【讨论】:

        【解决方案3】:

        您可以为您的 ListView 创建一个适配器,该适配器由任何对您有意义的数据结构支持。唯一的要求是适配器可以解释数据源中的项目并生成一个视图,该视图将成为 ListView 中的一行。我建议你看The World of ListView

        【讨论】:

          【解决方案4】:

          您可以使用简单的列表适配器来显示 xml 文件中的数据。 公共无效 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

              setListAdapter(new ArrayAdapter<String>(this, 
                      android.R.layout.simple_list_item_1, 
                      getResources().getStringArray(R.array.external xml file)));
          }
          

          【讨论】:

          • 只有代码的答案通常可以从一些解释性文字中受益。
          • 感谢指正,下次会记住这一点,这里是新的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多