在安卓中向动态列表视图添加动态字符串数组

3

我有一个字符串数组,是从外部XML响应中获取的。这个字符串数组可以在列表视图中呈现。 我想在用户到达列表视图中字符串数组的末尾元素时,将一个字符串数组与新的XML数据连接起来并添加到列表视图中。 我该如何实现这一点? 我已经对这个主题进行了很多研究。我几乎找不到任何与此上下文相关的例子。 任何帮助都将不胜感激。谢谢。

  ArrayList<String> get_msgList =MsgHandler.getMsgsList();
String[] msgList=new String[get_msgList.size()];
msgList=get_msgList.toArray(msgList);

 ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, get_msgList );
myListView.setAdapter(adapter);

这是我获取字符串数组并将其添加到列表视图的方法。

你能具体说明其他数据是什么吗?所有数据都来自XML文件吗? - Matt Wolfe
@MattWolfe 是的,所有数据都来自XML文件。我正在解析这些数据,然后将其存储在字符串数组中。 - Dinesh
有多少数据?在我看来,除非你有10,000个以上的值,否则最好一次性加载所有数据。只需读取每个文件,并将该数据添加到ArrayList中。然后使用该ArrayList与您的ArrayAdapter。如果您展示了迄今为止所做的代码,我们就可以知道如何最好地帮助您,这样您会得到更多的帮助。 - Matt Wolfe
如果你展示一下你目前的代码,我可能可以给你一些提示,告诉你如何将我下面的解决方案与你的代码结合使用。当你的描述过于泛泛时,很难为你提供具体的帮助。我认为我提供的解决方案可以工作,并且非常灵活/可扩展。 - Matt Wolfe
这个过程将会重复进行,新的字符串数组将被获取,我想将它们添加到现有的列表视图中。 - Dinesh
2个回答

2
-- 更新,经过更深入的文档研究,我认为您仍然可以使用ArrayAdapter --
因此,如果您查看listview的文档,您会看到:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="countries_array">
        <item>Bahrain</item>
        <item>Bangladesh</item>
        <item>Barbados</item>
        <item>Belarus</item>
        <item>Belgium</item>
        <item>Belize</item>
        <item>Benin</item>
    </string-array>
</resources>

"并且要加载这些,您可以使用:"
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, countries));

这里的问题是你必须处理确定它们何时到达列表末尾以及如何加载更多数据而不阻塞用户界面。
因此,为了避免很多麻烦,我建议使用Commonsware无限适配器。像这样做:
import android.app.ListActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import com.commonsware.cwac.endless.EndlessAdapter;
import java.util.ArrayList;

public class YourListActivity extends ListActivity {
  @Override
  public void onCreate(Bundle state) {
    super.onCreate(state);
    setContentView(R.layout.main);
    String[] countries = getResources().getStringArray(R.array.countries_array);
    setListAdapter(new YourAdapter(countries));
  }

  class YourAdapter extends EndlessAdapter {


    public YourAdapter(String[] list) {
      super(new ArrayAdapter<String>(YourAdapter.this,
                                      R.layout.row,
                                      android.R.id.text1,
                                      list));
    }

    @Override
    protected View getPendingView(ViewGroup parent) {
      View row=getLayoutInflater().inflate(R.layout.row, null);      
      return row.findViewById(android.R.id.text1);      
    }

    @Override
    protected boolean cacheInBackground() {
      SystemClock.sleep(10000);       // pretend to do work
      //put logic here to fetch the data
      //this happens in the background so you can't do anything with the UI
      //return whether or not you have more data, true if you do false otherwise.
      boolean haveMoreData = true;//this up to you to figure out
      return haveMoreData;
    }

    @Override
    protected void appendCachedData() {
        //here is where you do the work to actually add the data obtained in cacheInBackground to the ArrayAdapter
        ArrayAdapter<String> a=(ArrayAdapter<String>)getWrappedAdapter();        
        for (int i=0;i<25;i++) { 
           a.add(a.getCount()); 
        }
      }
    }
  }
}

这是一个类似于您的问题的另一个问题: Android无限列表 -- 更新:如何将多个字符串数组添加到适配器 -- 有多种方法可以实现这一点,最简单的方法可能是使用适配器的add方法。
看看这个:http://developer.android.com/reference/android/widget/ArrayAdapter.html 并查看add方法。 目前您有一个名为adapter的变量:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, get_msgList);

每当你想向该适配器添加更多数据时,只需调用:
  adapter.add("Some new data");

所以,如果你有另一个字符串数组的数据,并且想要将所有数据添加到当前适配器中,只需使用以下代码:
   String[] someNewData = getStringArray();//no idea how you are getting the array, this is just an example
   for (String s : someNewData) {
      adapter.add(s);
    }

“在您添加了新数据后,您可能需要调用adapter.notifyDataSetChanged,但我不确定(这可能会发生在您身上)...我建议您首先尝试不使用它,看看是否一切都按预期工作,如果不行再添加它。”
“现在,您可能想要做的一件事是将adapter变量设置为类的实例变量,以便您可以在类的任何地方使用它。”

我的问题是如何将字符串数组添加到适配器中? - Dinesh
好的,我刚刚添加了一小段代码来展示如何完成这个任务。使用 ArrayAdapter 的 add 方法,只要遍历新数组,对于 String 数组中的每个字符串值,都调用 adapter.add(string)。 - Matt Wolfe
我刚刚看到了你下面的评论。你应该绝对使用CommonsWare无限适配器。但是看起来你还在学习,所以如果你想尝试自己做,就去试试吧!在这个过程中你会学到很多东西。 - Matt Wolfe
谢谢。我正在查看CommonsWare无限适配器。 - Dinesh

0
我在想这个listview会显示多少数据。根据你提供的信息,似乎需要实现一个onScrollListener。当滚动到列表底部时,它将允许您加载更多数据(就像Facebook应用程序一样)。像Matt的回复所说,不要干扰UI加载,您需要设置一个线程来在UI线程之外加载数据。
当你说从外部源加载时,是通过互联网吗?如果是这样,上面的信息应该指引您正确的方向。如果“外部”意味着在另一个类中,最好一次性加载所有数据或将它们存储在数据库中,并运行游标以从中获取所需内容。

是的,数据是一个HTTP响应。因此,它来自于互联网。我希望列表有动态感觉。这就是为什么我希望在滚动时添加数据的原因。 - Dinesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接