【问题标题】:Searchview issues in fragment片段中的搜索视图问题
【发布时间】:2017-02-11 04:45:32
【问题描述】:

我在片段中使用搜索视图在列表视图中进行搜索。我能够执行搜索,但我面临两个问题。

1) 当列表中没有匹配的用户时,给出最后搜索的结果。

我想要什么:

我想显示一条消息说“没有搜索结果”

我尝试过的:

在设置适配器值后,我在其中 listview 所在的同一个 xml 和 java 文件中获取了一个 textview,我正在使用 setEmptyView 方法,但仍然没有得到想要的结果。

XML 代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="com.rider.project.Fragments.UsersListFragment">


<ListView android:id="@android:id/list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="visible"/>

<TextView android:id="@android:id/empty"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    android:text="No search results"
        android:visibility="gone"/>
</LinearLayout>

Java 代码

listView = (ListView) view.findViewById(android.R.id.list);
    adapter = new CustomAdapter(getActivity(),R.layout.program_list, users );
    listView.setAdapter(adapter);
    listView.setEmptyView(view.findViewById(android.R.id.empty));

我尝试了各种解决方案,仍然找不到结果。

2) 我在一个片段UserListsFragment.java 中有一个用户列表,其中我的搜索视图在那里,然后如果我们搜索某个用户,列表会显示搜索结果。单击任何用户名时,聊天屏幕将打开ChatFragment.java。现在,当我从聊天屏幕按下返回按钮时,列表中只有那些搜索到的用户可用,并且搜索菜单也会关闭。

我想要什么:

点击后退按钮时,我希望不仅显示以前搜索过的用户,还显示完整列表。

我做了什么

UserListsFragment.java

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {

    inflater.inflate(R.menu.menu_userlist,menu);
    MenuItem item = menu.findItem(R.id.menuSearch);

    SearchView searchView = (SearchView)item.getActionView();

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            Log.i(TAG,newText);
            adapter.getFilter().filter(newText);
            return true;
        }
    });
    super.onCreateOptionsMenu(menu,inflater);
}

private void logoutUser(){
    Intent I = new Intent(getActivity(), LoginActivity.class);
    startActivity(I);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.menuSearch :
            return true;

        case R.id.menuLogout :
            logoutUser();
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }

}

CustomAdapter.java

@Override
public Filter getFilter() {
    Filter filter = new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,FilterResults results) {

            if (results.values != null) {
                clear();
                addAll((List<UserData>) results.values);
                arrayList = (List<UserData>) results.values;
                notifyDataSetChanged();
            }
        }
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
            List<UserData> FilteredArrList = new ArrayList<UserData>();

            if (mOriginalValues == null) {
                mOriginalValues = new ArrayList<UserData>(arrayList); // saves the original data in mOriginalValues
            }

            if (constraint == null || constraint.length() == 0) {

                // set the Original result to return
                results.count = mOriginalValues.size();
                results.values = mOriginalValues;
            } else {
                constraint = constraint.toString().toLowerCase();

                for (int i = 0; i < mOriginalValues.size(); i++) {
                    String data = mOriginalValues.get(i).getName();
                    if (data.toLowerCase().contains(constraint.toString())) {
                        FilteredArrList.add(mOriginalValues.get(i));
                        results.count = FilteredArrList.size();
                        results.values = FilteredArrList;
                    }
                }
                // set the Filtered result to return

            }

            return results;
        }

    };
    return filter;
}
}

【问题讨论】:

  • 您需要一些自定义适配器,例如:class Adapter extends MatchableArrayAdapter&lt;UserData&gt; { ... 并覆盖其 onBind 和 matches 方法
  • 我已经在扩展public class CustomAdapter extends ArrayAdapter&lt;UserData&gt; implements Filterable
  • 所以不要扩展 ArrayAdapter,而是扩展 MatchableArrayAdapter
  • 它给了我一个错误'无法解析符号 MatchableArrayAdapter
  • 你在我的第一条评论中有一个链接

标签: java android listview android-fragments


【解决方案1】:

当您搜索某些内容但没有找到任何内容时,将空文本视图设置为 "No search results" 并再次将其设置为 listView,如下所示:

tv.setText("No search results");
listView.setEmptyView(tv);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    相关资源
    最近更新 更多