android - 在 Android 中使用 SearchView 进行搜索后,ListView 未更新

标签 android searchview custom-adapter android-searchmanager

我正在尝试开发一个将具有 SearchView 的应用程序。我已经成功地实现了在 ListView 中过滤结果和更新的逻辑。但是当我取消或关闭搜索时,ListView 上的数据不会恢复到它的旧列表。我一直在尝试所有可能的方法并停留在这里很长时间。请帮我解决这个问题。 这是我编写的代码:

主 Activity .java

package com.example.arushi.searchviewcustom;

  import android.os.Bundle;
      import android.support.v7.app.AppCompatActivity;
      import android.support.v7.widget.Toolbar;
    import android.text.TextUtils;
    import android.view.Menu;
     import android.view.MenuItem;
   import android.view.View;
     import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
   import android.widget.ListView;
    import android.widget.Toast;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {
ListView lv_listname;
ArrayList<Beanclass> al_names,al_names2;
ArrayList<String> altype;
Adap ad_names;
ArrayAdapter<String> ad;
com.example.arushi.searchviewcustom.MaterialSearchView searchview;
Toolbar toolbar;
android.widget.Filter filter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv_listname = (ListView) findViewById(R.id.listView);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //  toolbar.setNavigationIcon(R.drawable.back_arrow_white);

    searchview = (com.example.arushi.searchviewcustom.MaterialSearchView) findViewById(R.id.searchview);

    al_names = new ArrayList<>();
   /* altype=new ArrayList<>();

    altype.add("Rushi");
    altype.add("ayyappa");
    altype.add("kiran");
    altype.add("priya");
    altype.add("swathi");
    altype.add("pen");
    altype.add("bat");
    altype.add("cat");
    ad = new ArrayAdapter<String>   
       (MainActivity.this,android.R.layout.simple_list_item_1,altype);
    lv_listname.setAdapter(ad);
    filter=ad.getFilter();*/
    //         ad.notifyDataSetChanged();
    al_names.add(new Beanclass("Rushi", 22));
    al_names.add(new Beanclass("Swathi", 22));
    al_names.add(new Beanclass("Priya", 22));
    al_names.add(new Beanclass("Kiran", 22));
    al_names.add(new Beanclass("Laskshmi", 22));
    al_names.add(new Beanclass("Hammad", 22));
    al_names.add(new Beanclass("Anil", 22));
    al_names.add(new Beanclass("Anand", 22));
    al_names2=al_names;
    ad_names = new Adap(MainActivity.this,al_names);
    lv_listname.setAdapter(ad_names);

    lv_listname.setTextFilterEnabled(false);
 //   filter = ad_names.getFilter();
    //ad_names.notifyDataSetChanged();
    /*setupSearchView();*/

         searchview.setOnSearchViewListener(new       


           com.example.arushi.searchviewcustom.MaterialSearchView.SearchViewListener() {
        @Override
        public void onSearchViewShown() {
            searchview.setVisibility(View.VISIBLE);
            Toast.makeText(getApplicationContext(), "opened ", Toast.LENGTH_LONG).show();
            toolbar.setVisibility(View.GONE);
        }

        @Override
        public void onSearchViewClosed() {
        //  lv_listname.clearTextFilter();

            Toast.makeText(getApplicationContext(), "closed ", Toast.LENGTH_LONG).show();
            toolbar.setVisibility(View.VISIBLE);

        }
    });


    searchview.setOnQueryTextListener(new com.example.arushi.searchviewcustom.MaterialSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (TextUtils.isEmpty(newText)) {
                lv_listname.clearTextFilter();
            } else {
                 // lv_listname.setFilterText(newText);
                ad_names.getFilter().filter(newText);
                //filter.filter(newText);
            }
            return true;
        }
    });
    lv_listname.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getApplicationContext(), "you clicked on " + al_names.get(position), Toast.LENGTH_LONG).show();
        }
    });
    // searchview.setSubmitButtonEnabled(true);
    searchview.setHint("Search Containers");
}

private void setupSearchView() {
    //  searchview.setIconifiedByDefault(false);

    //   searchview.seti
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem item = menu.findItem(R.id.searchicon);
    searchview.setMenuItem(item);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.searchicon) {
        searchview.setVisibility(View.VISIBLE);

    }



    return super.onOptionsItemSelected(item);
}



  }

这是我的 AdapterClass

package com.example.arushi.searchviewcustom;

        import android.content.Context;
        import android.text.TextUtils;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseAdapter;
        import android.widget.Filter;
        import android.widget.Filterable;
        import android.widget.TextView;
        import java.util.ArrayList;
        import java.util.List;
       class Adap extends BaseAdapter implements Filterable {
         public ArrayList<Beanclass> mData;
         public ArrayList<Beanclass> mFilteredData ;
        Context ctx;

        public Adap(Context ctx,ArrayList<Beanclass> al_names) {
        mData=al_names;
   mFilteredData=al_names;
    this.ctx=ctx;
}


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

@Override
public Object getItem(int position) {
    return position;
}

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

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
   // LayoutInflater lf =;
    convertView = LayoutInflater.from(ctx).inflate(R.layout.pattern, parent, false);
    TextView tv = (TextView) convertView.findViewById(R.id.textView);
    TextView tv2 = (TextView) convertView.findViewById(R.id.textView2);
    tv.setText(mFilteredData.get(position).getName());
    tv2.setText("age:" + mFilteredData.get(position).getAge());

    return convertView;
}

@Override
public Filter getFilter() {

  /*  if (mContactsFilter == null)
        mContactsFilter = new Filterer(mData);

    return mContactsFilter;
}*/
    return new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults oReturn = new FilterResults();
            ArrayList<Beanclass> results = new ArrayList<Beanclass>();
            if (TextUtils.isEmpty(constraint))
            //   orig = al_namesfilter;
            {
                oReturn.count = mData.size();
                oReturn.values = mData;
            } else {
                List<Beanclass> resultList = new ArrayList<>();
                //    if (orig != null && orig.size() > 0) {

                for (final Beanclass g : mData) {
                    if ((g.getName().toLowerCase()
                            .contains(constraint.toString())))
                        //   results.add(g);
                        resultList.add(g);
                }
                //  }
                oReturn.count = resultList.size();
                oReturn.values = resultList;
            }
            return oReturn;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
           /* al_namesfilter = (ArrayList<Beanclass>) results.values;
            notifyDataSetChanged();*/
            if (results.count == 0) {
                notifyDataSetInvalidated();
            } else {
                mFilteredData = (ArrayList<Beanclass>) results.values;
                notifyDataSetChanged();
            }
        }
    };

}
         }

请帮我看看我哪里做错了?

最佳答案

我有同样的问题&为此花了很多时间

也许你的代码没有问题

让我们检查 ListView 布局,确保下面没有为其添加任何约束

    android:layout_width="match_parent"
    android:layout_height="match_parent"

关于android - 在 Android 中使用 SearchView 进行搜索后,ListView 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35849461/

相关文章:

android - 如何在不影响滚动的情况下对 ListView 的项目实现 onTouchListener

android - 将特征添加到android

java - Android 中的 Searchview 可以工作,但点击时显示不正确的结果。

android - 更改searchview左后按钮的颜色

android - 如何取消选择 ListView 项目?

java - 从自定义适配器获取父布局

java - 迁移AndroidX运行报错android.support.annotation does not exist

android - 适用于 Android 的烛台图表组件

android xml Textview文本属性不能取 '<'作为值

android - 如何在操作栏中隐藏搜索 View