0

我想搜索一个字符串数组并将结果放入 ListView。

所以,如果我有

<string-array name="Colors">
    <item>Red</item>
    <item>Yellow</item>
    <item>Blue</item>
    <item>DarkRed</item>
</string>

我搜索“红色”,我应该进入 ListView 两个项目。对于每个项目,我想知道字符串数组中的 ID 和字符串值,它们将显示在 ListView 中。

在搜索结果时,我想显示一个 ProgressBar(不确定状态),当一切完成时它会消失。

第一步是将字符串数组放入 List 或 String[],然后创建一个新线程来比较数组中的每个项目,并将匹配搜索文本的项目放在 ListView 上。

我不知道这是最好的方法。我的代码是这样的:

public class SearchActivity extends Activity {
    private ProgressBar mProgress;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        mProgress = (ProgressBar) findViewById(R.id.Progress);

        new Thread(new Runnable() {
            public void run() {
            int item_pos = 0;
            int item_count = 0;

            String[] Colors = getResources().getStringArray(R.array.Colors); 
                item_count = Colors.length();

                mProgress.setVisibility(View.VISIBLE);

                while (item_pos < item_count) {
                    // Compare with the search text
                    // Add it to the ListView (I don't know how)
                    item_pos +=1;
                }
                mProgress.setVisibility(View.GONE);
            }
        }).start();
    }
}

所以,我的问题:

  1. 如何获取项目 ID 和字符串,然后将每个文本值与搜索文本进行比较?
  2. 如何将项目添加到 ListView?
  3. 为什么 ProgressBar 不可见?ProgressBar XML 代码是这样的:

    <ProgressBar
        android:id="@+id/Progress"
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:visibility="visible" />
    

感谢您的所有建议和帮助!

4

1 回答 1

3

这是我解决这个问题的方法。

首先,我会string-array这样:

    Resources res = getResources();
    String[] colors = res.getStringArray(R.array.Colors);
    // transform into ArrayList for ease of use
    ArrayList<String> colorsList = Arrays.asList(colors); 

在列表中搜索所需的序列并删除任何不需要的元素:

for (String s : colorsList) {  
   if (!s.contains("red")) { // hardcoded, only to illustrate my logic
      colorsList.remove(s);
   }
}  

现在您有了一个没有不需要元素的列表,只需将其绑定到您ListViewArrayAdapter. 该文档包含一篇关于基本 ListView 用法的精彩文章。

如果你Activity只包含一个 ListView 作为它的唯一元素,你可以扩展你的 ActivityListActivity而不是Activity. 它将为您提供一些新的好处,例如简单地调用getListView()以轻松获取您的 ListView。

就您的 ProgressBar 而言,我建议您查看AsyncTask该类,它将提供一种更优雅的方式来处理您的应用程序中的线程。Android 开发团队确实建议您使用 AsyncTask 而不是Runnable您现在使用的经典方法。

最后,如果你正在寻找更多关于 ListViews 的代码片段,你真的应该看看这里,它充满了来自 Android 团队的示例。当我开始使用 Android 并且无法理解 ListViews 时,这对我很有帮助。

希望这有帮助!

于 2012-04-23T19:22:18.607 回答