【问题标题】:SearchView doesn't work when searching rows in a custom listview在自定义列表视图中搜索行时,SearchView 不起作用
【发布时间】:2016-03-12 18:00:58
【问题描述】:

我有一个项目,我可以在其中添加数据、删除它们并使用 SQLite 更新它们。当然,我将它们显示在列表视图中。我想做的最后一件事是使用 searchView 对象,这样用户就可以搜索他想要的数据并检查它们是否存在。但是 SearchView 对象什么也不做。我故意键入列表视图中存在的内容并且匹配的行没有出现。

这是我的代码。

public class DisplayForldersActivity extends AppCompatActivity {
DatabaseHandler dba;

private ArrayList<MyFolder> dbFolders = new ArrayList<>();
private FolderAdapter folderAdapter;
private ListView listView;

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

    listView = (ListView)findViewById(R.id.list);
    inputSearch = (SearchView) findViewById(R.id.inputSearch);


    fetchDataFromDB();


}

private void fetchDataFromDB() {
    dbFolders.clear();
    dba = new DatabaseHandler(getApplicationContext());

    ArrayList<MyFolder> foldersFromDB = dba.getFolderDetails();

    for(int i=0; i<foldersFromDB.size();i++){

        String plateNo = foldersFromDB.get(i).getPlateNumber();
        String owner = foldersFromDB.get(i).getOwnerName();
        String cardId = foldersFromDB.get(i).getCardId();
        String content = foldersFromDB.get(i).getContent();
        String date = foldersFromDB.get(i).getRecordDate();
        int mid = foldersFromDB.get(i).getItemId();

        MyFolder f = new MyFolder();
        f.setPlateNumber(plateNo);
        f.setOwnerName(owner);
        f.setCardId(cardId);
        f.setContent(content);
        f.setRecordDate(date);
        f.setItemId(mid);

        dbFolders.add(f);

        folderAdapter = new FolderAdapter(DisplayForldersActivity.this,R.layout.folders_row,dbFolders);
        listView.setAdapter(folderAdapter);
        folderAdapter.notifyDataSetChanged();

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

            @Override
            public boolean onQueryTextChange(String newText) {
                folderAdapter.getFilter().filter(newText);
                return false;
            }
        });

    }
    dba.close();
}

还有我的适配器代码

 private class FolderAdapter extends ArrayAdapter<MyFolder>{
    Activity activity;
    int layoutResource;
    MyFolder myFolder;
    ArrayList<MyFolder> mData = new ArrayList<>();


    public FolderAdapter(Activity act, int resource, ArrayList<MyFolder> data) {
        super(act, resource,data);

        activity = act;
        layoutResource = resource;
        mData = data;

        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public MyFolder getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = convertView;

        ViewHolder holder = null;

        if(row == null || row.getTag()==null){
            LayoutInflater inflater = LayoutInflater.from(activity);

            row = inflater.inflate(layoutResource,null);

            holder = new ViewHolder();

            holder.mPlateNo = (TextView)row.findViewById(R.id.plateNumberList);
            //holder.mOwner = (TextView)row.findViewById(R.id.ownerName);
            holder.mcardId = (TextView)row.findViewById(R.id.idNumber);
            //holder.mContent = (TextView)row.findViewById(R.id.processing);
            holder.mDate = (TextView)row.findViewById(R.id.dateText);

            row.setTag(holder);

        }else{
            holder = (ViewHolder)row.getTag();
        }
        holder.myF = getItem(position);

        holder.mPlateNo.setText(holder.myF.getPlateNumber());
        //holder.mOwner.setText(holder.myF.getOwnerName());
        //holder.mcardId.setText(holder.myF.getCardId());
        //holder.mPlateNo.setText(holder.myF.getPlateNumber());
        holder.mDate.setText(holder.myF.getRecordDate());
        final ViewHolder finalHolder = holder;


        holder.mPlateNo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String dateText = finalHolder.myF.getRecordDate().toString();
                String owner = finalHolder.myF.getOwnerName().toString();
                String cardId = finalHolder.myF.getCardId().toString();
                String plateNumber = finalHolder.myF.getCardId().toString();
                String content = finalHolder.myF.getContent().toString();

                int mid = finalHolder.myF.getItemId();


                Intent i = new Intent(DisplayForldersActivity.this,DetailedFolderActivity.class);
                i.putExtra("id",mid);
                i.putExtra("owner",owner);
                i.putExtra("cardId",cardId);
                i.putExtra("plateNumber",plateNumber);
                i.putExtra("content",content);
                i.putExtra("dateText",dateText);

                startActivity(i);
            }
        });

        return row;
    }

    class ViewHolder{
        MyFolder myF;
        int mid;
        TextView mPlateNo;
        TextView mOwner;
        TextView mcardId;
        TextView mContent;
        TextView mDate;


    }


}

我做错了吗?谢谢

【问题讨论】:

  • 不,不,不,如果您的数据来自 sqlite 数据库,请使用SimpleCursorAdapter,而不是ArrayAdapter
  • 尝试在 mainActivity 中的适配器上调用 notifyDataSetChange 在这一行“folderAdapter.getFilter().filter(newText);”之后
  • 如果您的ListView 行中有多个TextView,如果您为此实现所有内容,SearchView 将不会搜索。
  • 我基本上需要一个精确的解决方案。但我认为 SearchView 是微不足道的。我的意思是我可以将这些数据发布到服务器中,然后使用适当的网络服务进行搜索。
  • @Theo 这就是它的工作原理:pastebin.com/e7HLF6X6

标签: android listview search


【解决方案1】:

您需要在连接到 listView 的适配器中调用 notifyDataSetChanged 以使 ListView 无效并使其绘制更改/删除/插入的行。

【讨论】:

    【解决方案2】:

    您的数组适配器需要实现 Filterable 接口,该接口将覆盖 getFilter() 方法。然后在您的 getFilter() 方法中,您可以执行过滤操作。

    查看此 stackoverflow 链接,此代码可能会对您有所帮助 No results with custom ArrayAdapter Filter

    【讨论】:

      【解决方案3】:

      SerchView 不处理任何搜索,它只是一个小部件。您必须自己实现搜索逻辑。尝试此处描述的解决方案: http://developer.android.com/guide/topics/search/search-dialog.html

      您也可以通过调用 SearchView.setOnQueryTextListener(SearchView.OnQueryTextListener listener) 并传入侦听器的自定义实现来做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 2016-01-21
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多