【问题标题】:Android ArrayAdapter Filter not working properlyAndroid ArrayAdapter 过滤器无法正常工作
【发布时间】:2016-03-15 10:58:11
【问题描述】:

我在使用带有 ArrayAdapter 的过滤器时遇到问题。

我有一个与数据一起发布的 ListView。在 ListView 上方有一个 EditText 字段,上面有一个 TextChangeListener。当输入一个肯定出现在 ListView 中的字符序列时,在某些情况下 ListView 之后会保持空白。 ListView 中的元素格式如下:

FFI 01 Jacket
Test, User
Locker 101
----------------
FFI 01 Helmet
Test, User
Locker 101
----------------
FFI 02 Jacket
Test, User2
Locker 102
----------------
.
.
.

等等。

  • 如果我搜索“FFI”、“01”、“02”、“夹克”或“头盔”,则只剩下带有过滤文本的项目。
  • 如果我搜索“User”、“User2”、“101”或“102”,则只剩下包含过滤文本的项目。
  • 如果我搜索“Test”或“Locker”,ListView 为空。

这是我的代码:

TextChangeListener:

eText.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
    // When user changed the Text
    if (!cs.equals(null) || !cs.equals("") || !cs.equals(" ")) {
        MainActivity.this.adapter.getFilter().filter(cs);
    }
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

@Override
public void afterTextChanged(Editable arg0) {}
});

填充适配器和列表视图:

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + "AUSRUEST.DBF");
DbfIterator dbfIterator = DbfEngine.getReader(file, null);
DbfHeader dbfHeader = DbfEngine.getHeader(file, null);
int numCols = dbfHeader.getCountColumns();
int numRows = dbfHeader.getCountRecords();
arrayListView = new String[numRows][numCols];
int i=0;
Set<String> set = new HashSet<String>();
while (dbfIterator.hasMoreRecords()) {
    DbfRecord dbfRecord = dbfIterator.nextRecord();

    if (dbfRecord.getString("FW_NR") != null && !dbfRecord.getString("FW_NR").startsWith("?")) {
        String setText = dbfRecord.getString("FW_NR")+"\n"+dbfRecord.getString("STANDORT1")+"\n"+dbfRecord.getString("ABLAGE")+"\n";
        setText = setText.replace("null", "---");
        set.add(setText);
    }

    arrayListView[i][0] = dbfRecord.getString("GRUPPE2");
    arrayListView[i][1] = dbfRecord.getString("FW_NR");
    arrayListView[i][2] = dbfRecord.getString("STANDORT1");
    arrayListView[i][3] = dbfRecord.getString("ABLAGE");
    //Date date = dbfRecord.getDate("date_val");
    String test = arrayListView[i][0];
    String test1 = arrayListView[i][1];
    String test2 = arrayListView[i][2];
    String test3 = arrayListView[i][3];
    System.out.println(arrayListView[i][0] + " " + arrayListView[i][1] + " " + arrayListView[i][2] + " "+ arrayListView[i][3]);
    i++;
}
List<String> al = new ArrayList<String>(set);
Collections.sort(al);
System.out.println(" ");
ListView lv = (ListView) findViewById(R.id.listView);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al);
lv.setAdapter(adapter);

【问题讨论】:

  • 替换 "\n" dbfRecord.getString("FW_NR")+"\n"+dbfRecord.getString("STANDORT1")+"\n"+dbfRecord.getString("ABLAGE")+"\n""\n " 并尝试。
  • 非常感谢 :) 那行得通。我猜这是因为过滤器看到的是“\nTest”而不是“Test”吧?
  • 是的,仅此而已。

标签: android listview search android-arrayadapter


【解决方案1】:

替换这个sn-p的代码:

"\n" dbfRecord.getString("FW_NR")+"\n"+dbfRecord.getString("STAND‌​ORT1")+"\n"+dbfRecor‌​d.getString("ABLAGE"‌​)+"\n"

"\n " 试试看。

尼甘帕特罗的回答

【讨论】:

    【解决方案2】:

    另一种方法可能是......

    public class SomeAdapter extends BaseAdapter implements Filterable {}

    然后在类SomeAdapter中实现接口Filterable的方法。

    上述代码总体上缺乏职责分离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2023-03-11
      • 2015-02-14
      • 2013-08-16
      • 2012-11-16
      相关资源
      最近更新 更多