java - 如何过滤ListView中的内容

标签 java android listview filter

我用谷歌搜索了其他解决方案,但找不到任何与我的情况相似的解决方案,起初我尝试获取 TextView 和过滤器的内容,但没有成功,请帮助。所以在这里我创建了一个 ListView ,它由三个 TextView 组成,每个 TextView 是一个列,并且数据是从服务器动态添加的。如何根据用户搜索过滤内容。 这是下面的代码。

MainActivity.java

public class MainActivity extends AppCompatActivity {
private void showJSON2(String response){
    String id="";
    String name="";
    String date_from="";
    String date_to="";
    try {
        JSONObject jsonObject = new JSONObject(response);
        JSONArray result = jsonObject.getJSONArray(JSON_ARRAY2);
        ListView listView = (ListView) findViewById(R.id.list_view);
        list = new ArrayList<HashMap<String, String>>();
        for (int i=0; i<result.length(); i++) {
            JSONObject notice = result.getJSONObject(i);
            id = notice.getString(KEY_ID);
            name = notice.getString(KEY_NAME);
            date_from = notice.getString(KEY_DATE_FROM);
            date_to = notice.getString(KEY_DATE_TO);

            HashMap<String, String> temp= new HashMap<String, String>();
            temp.put(FIRST_COLUMN, id);
            temp.put(SECOND_COLUMN, name);
            temp.put(THIRD_COLUMN, date_from);
            temp.put(FOURTH_COLUMN, date_to);
            list.add(temp);

        }

        ListViewAdapters adapter = new ListViewAdapters(this, list);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, final View view, int position, long id)
            {
                int pos=position+1;
                Toast.makeText(MainActivity.this, Integer.toString(pos)+" Clicked", Toast.LENGTH_SHORT).show();
            }

        });

    } catch (JSONException e) {
        e.printStackTrace();
    }
  }
}

ListViewAdapters.java -

public class ListViewAdapters extends BaseAdapter{
public ListViewAdapters(Activity activity,ArrayList<HashMap<String, String>> list){
    super();
    this.activity=activity;
    this.list=list;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    LayoutInflater inflater=activity.getLayoutInflater();
    if(convertView == null){
        convertView=inflater.inflate(R.layout.colmn_row, null);
        txtFirst=(TextView) convertView.findViewById(R.id.name);
        txtSecond=(TextView) convertView.findViewById(R.id.gender);
        txtThird=(TextView) convertView.findViewById(R.id.age);
        txtFourth=(TextView) convertView.findViewById(R.id.status);
    }
    HashMap<String, String> map=list.get(position);
    txtFirst.setText(map.get(FIRST_COLUMN));
    txtSecond.setText(map.get(SECOND_COLUMN));
    txtThird.setText(map.get(THIRD_COLUMN));
    txtFourth.setText(map.get(FOURTH_COLUMN));
    return convertView;
  }
}

最佳答案

在MainActivity.java中,

public class MainActivity extends AppCompatActivity {

    ArrayList<HashMap<String, String>> list = new ArrayList<>();
    ListViewAdapters adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_default);

        adapter = new ListViewAdapters(this, list);
        listView.setAdapter(adapter);
    }

    private void showJSON2(String response) {
        ...
        list.clear();
        ...
        list.add(temp);
        ...

        // ListViewAdapters adapter = new ListViewAdapters(this, list);
        // listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        ...
    }

}

在适配器类中,

public class ListViewAdapters extends BaseAdapter {

    ArrayList<HashMap<String, String>> origList = new ArrayList<>();

    public ListViewAdapters(Activity activity,ArrayList<HashMap<String, String>> list) {
        super();
        this.activity=activity;
        this.list=list;
        this.origList=list;
    }

    ...

    void filter(String filterString) {
        list = new ArrayList<>();
        for (HashMap<String, String> item: origList) {
            // use your own logic to filter
            if (itemShouldBeAdded)
                list.add(item); // add if item is inside filter
        }
        notifyDataSetChanged();
    }

    void cancelFilter() {
        list = origList;
        notifyDataSetChanged();
    }

}

现在,要进行过滤,请调用函数filter。

adapter.filter("some_string");

要取消过滤器,

adapter.cancelFilter();

关于java - 如何过滤ListView中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390373/

相关文章:

java - 如何在 Android 应用程序中禁用 Android 键盘

android - 如何增加 ListView 的 View 大小?

java - 如果一个类没有状态,所有的方法都应该是静态的吗?

java - 为 JFrame 制作自定义图标

java - 我可以强制 Intellij-IDEA 运行忽略的测试吗?

java: 线程 "main"java.lang.NoClassDefFoundError: Chain_of_Responsibility 中的异常

android - 如何更改 kotlin 中的语言(语言环境)

java - 未捕获匿名内部类中抛出的异常

java - 前进 ListView 下一项/setSelectionFromTop 不起作用/禁止用户滚动 ListView

c# - 我如何按字母顺序对我的 ListView 进行排序?