Java 带有GridView的SearchView小部件。我在搜索字段中键入,但它不为n';不要刷新GridView

Java 带有GridView的SearchView小部件。我在搜索字段中键入,但它不为n';不要刷新GridView,java,android,gridview,widget,searchview,Java,Android,Gridview,Widget,Searchview,我不熟悉编码。我正在尝试实现一个SearchView小部件,它应该更新GridView,但它不起作用。当我在搜索字段中键入某个内容时,什么也没有发生。如果我点击搜索按钮也不会发生任何事情。你能帮帮我吗 这是主要的活动: public class MainActivity extends AppCompatActivity { private static Context mainContext; private FragmentDataSaver mDataSaver;

我不熟悉编码。我正在尝试实现一个SearchView小部件,它应该更新GridView,但它不起作用。当我在搜索字段中键入某个内容时,什么也没有发生。如果我点击搜索按钮也不会发生任何事情。你能帮帮我吗

这是主要的活动:

public class MainActivity extends AppCompatActivity  {

    private static Context mainContext;

    private FragmentDataSaver mDataSaver;
    private static final String DATA_SAVER_TAG = "DATA_SAVER";

    private View mDecorView;

    public ArrayList<Movies> mMovies;

    WallAdapter wallAdapter;

    GridView gridView;

    public static Context getContext(){
        return mainContext;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        mDecorView = getWindow().getDecorView();

        mainContext = getApplicationContext();

        setContentView(R.layout.activity_main);

        Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(myToolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        FragmentManager fm = getSupportFragmentManager();
        mDataSaver = (FragmentDataSaver)fm.findFragmentByTag(DATA_SAVER_TAG);

        if(mDataSaver == null){
            mDataSaver = new FragmentDataSaver();
            fm.beginTransaction().add(mDataSaver, DATA_SAVER_TAG).commit();

            mMovies = DatabaseProva.creaDatabaseProva();
            mDataSaver.setData(mMovies);
        } else {
            mMovies = mDataSaver.getData();
        }

        gridView = (GridView)findViewById(R.id.gridview_layout);

        /*if(savedInstanceState == null){
            mMovies = DatabaseProva.creaDatabaseProva();
        } else {
            mMovies = savedInstanceState.getParcelableArrayList("tempMovies");
        }*/

        wallAdapter = new WallAdapter(this, mMovies);
        gridView.setAdapter(wallAdapter);

        handleIntent(getIntent());

    }

    @Override
    protected void onNewIntent(Intent intent) {
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {

        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search your data somehow
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.toolbar_menu, menu);
        MenuItem searchMenu = menu.findItem(R.id.search_view);

        // Get the SearchView and set the searchable configuration
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        android.widget.SearchView searchView = (android.widget.SearchView) searchMenu.getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
        searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                wallAdapter.getFilter().filter(newText);

                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if(hasFocus){
            mDecorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    /*@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList("tempMovies", wallAdapter.getItems());
    }*/
public类MainActivity扩展了AppCompatActivity{
私有静态语境;
私有碎片数据保存器mDataSaver;
私有静态最终字符串数据\u SAVER\u TAG=“数据\u SAVER”;
私有视图mDecorView;
公共阵列列表mMovies;
小袋鼠小袋鼠;
GridView;
公共静态上下文getContext(){
返回主上下文;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mDecorView=getWindow().getDecorView();
mainContext=getApplicationContext();
setContentView(R.layout.activity_main);
Toolbar myToolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(myToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
FragmentManager fm=getSupportFragmentManager();
mDataSaver=(FragmentDataSaver)fm.findFragmentByTag(DATA\u SAVER\u TAG);
if(mDataSaver==null){
mDataSaver=new FragmentDataSaver();
fm.beginTransaction().add(mDataSaver,DATA_SAVER_TAG).commit();
mMovies=DatabaseProva.creadatabbaseprova();
mDataSaver.setData(mMovies);
}否则{
mMovies=mDataSaver.getData();
}
gridView=(gridView)findViewById(R.id.gridView\u布局);
/*如果(savedInstanceState==null){
mMovies=DatabaseProva.creadatabbaseprova();
}否则{
mMovies=savedInstanceState.getParcelableArrayList(“临时电影”);
}*/
wallAdapter=新的wallAdapter(这是mMovies);
setAdapter(wallAdapter);
handleIntent(getIntent());
}
@凌驾
受保护的void onNewIntent(意图){
手册内容(意图);
}
私人无效手册内容(意图){
if(Intent.ACTION_SEARCH.equals(Intent.getAction())){
String query=intent.getStringExtra(SearchManager.query);
//使用查询以某种方式搜索数据
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。工具栏菜单,菜单);
MenuItem searchMenu=menu.findItem(R.id.search\u视图);
//获取SearchView并设置可搜索配置
SearchManager SearchManager=(SearchManager)getSystemService(Context.SEARCH\u服务);
android.widget.SearchView SearchView=(android.widget.SearchView)searchMenu.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName());
searchView.setIconifiedByDefault(false);//不要将小部件图标化;默认情况下展开它
searchView.setOnQueryTextListener(新的android.widget.searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
wallAdapter.getFilter().filter(newText);
返回false;
}
});
返回super.onCreateOptions菜单(菜单);
}
@凌驾
WindowFocusChanged上的公共无效(布尔hasFocus){
super.onWindowFocusChanged(hasFocus);
如果(hasFocus){
mDecorView.setsystemivilibility(
View.SYSTEM\u UI\u FLAG\u布局\u稳定
|View.SYSTEM\u UI\u FLAG\u布局\u隐藏\u导航
|View.SYSTEM\u UI\u FLAG\u布局\u全屏显示
|View.SYSTEM\u UI\u FLAG\u HIDE\u导航
|View.SYSTEM\u UI\u FLAG\u全屏显示
|视图。系统\用户界面\标志\沉浸式\粘性);
}
}
/*@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
outState.putParcelableArrayList(“tempMovies”,wallAdapter.getItems());
}*/
适配器(WallAdapter):

public类WallAdapter扩展了ArrayAdapter,实现了Filterable{
私有ArrayList tempMovies=新ArrayList();
公共WallaAdapter(上下文、ArrayList电影){
超级(上下文、0、电影);
设置项目(电影);
}
公共阵列列表getMovies(){
返回临时电影;
}
公共无效集合项(ArrayList电影){
this.tempovies=电影;
}
公共阵列列表getItems(){
返回临时电影;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.item_布局,父项,false);
holder=新的ViewHolder();
holder.mImage=(ImageView)convertView.findViewById(R.id.item_视图);
holder.mImage.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
最终电影currentMovie=getItem(位置);
holder.mImage.setImageBitmap(currentMovie.getImage());
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent Intent=新的Intent(getContext(),SchedaFilm.class);
intent.putExtra(“titolo”,currentMovie.getitolo());
intent.putExtra(“locandina”,currentMovie.getIdLocandina());
意向书
public class WallAdapter extends ArrayAdapter<Movies> implements Filterable{

    private ArrayList<Movies> tempMovies = new ArrayList<Movies>();


    public WallAdapter(Context context, ArrayList movies) {
        super(context, 0, movies);
        setItems(movies);
    }

    public ArrayList<Movies> getMovies() {
        return tempMovies;
    }

    public void setItems(ArrayList<Movies> movies) {
        this.tempMovies = movies;
    }

    public ArrayList<Movies> getItems() {
        return tempMovies;
    }

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

        ViewHolder holder;

        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            holder.mImage = (ImageView) convertView.findViewById(R.id.item_view);
            holder.mImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final Movies currentMovie = getItem(position);

        holder.mImage.setImageBitmap(currentMovie.getImage());

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), SchedaFilm.class);
                intent.putExtra("titolo", currentMovie.getTitolo());
                intent.putExtra("locandina", currentMovie.getIdLocandina());
                intent.putExtra("trama", currentMovie.getTrama());
                intent.putExtra("regia", currentMovie.getRegia());
                intent.putExtra("anno", currentMovie.getAnno());
                intent.putExtra("genere", currentMovie.getGenere());
                getContext().startActivity(intent);
            }
        });

        return convertView;
    }

    Filter filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            ArrayList<Movies> tempList = new ArrayList<>();
            //constraint is the result from text you want to filter against.
            //objects is your data set you will filter from
            if(constraint != null || constraint.length() == 0) {
                // No filter implemented we return all the list
                filterResults.values = tempMovies;
                filterResults.count = tempMovies.size();
            } else {
                for(Movies m : tempMovies){
                    if(m.toString().toLowerCase().contains(constraint.toString().toLowerCase())){
                        tempList.add(m);
                    }
                }

                filterResults.values = tempList;
                filterResults.count = tempList.size();
            }


            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if(results.count == 0){
                notifyDataSetInvalidated();
            } else {
                tempMovies = (ArrayList<Movies>) results.values;
                notifyDataSetChanged();
            }
        }
    };

    @NonNull
    @Override
    public Filter getFilter() {
        return filter;
    }

    static class ViewHolder{

        private ImageView mImage;

        public Context getContext(){
            return mImage.getContext();
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<manifest package="arca.mitty.com.arcagridview"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity"
                  android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <action android:name="android.intent.action.SEARCH" />
                <meta-data android:name="android.app.searchable"
                           android:resource="@xml/searchable"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".SchedaFilm"
            android:parentActivityName=".MainActivity">
        </activity>
    </application>

</manifest>
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_label"
        android:hint="@string/search_hint" >
</searchable>  
public class Movies implements Parcelable{

    private String mTitolo;
    private String mGenere;
    private Bitmap mLocandina;
    private Bitmap mLocandinaBig;
    private int mAnno;
    private int mIdLocandina;

    private String mTrama = "Seduto sulla panchina ad un bus-stop di Savannah, " +
            "Forrest Gump ricorda la sua infanzia di bimbo con problemi mentali e fisici. " +
            "Solo la mamma lo accetta per quello che è, e solo la piccola Jenny Curran lo fa sedere accanto a sé sull'autobus della scuola. " +
            "Sarà lei a incitarlo, per fuggire a tre compagnetti violenti, a correre, liberando così le gambe dalla protesi. " +
            "Attraverso trent'anni di storia americana vista con gli occhi della semplicità e dell'innocenza, Forrest diventa un campione universitario di football, " +
            "mentre è sempre più innamorato di Jenny che però lo considera un fratello. Assiste ai disordini razziali in Alabama ed incontra Kennedy poco prima dell'assassinio. " +
            "Si arruola quindi nell'esercito, dove fa amicizia con il nero Bubba, un pescatore di gamberi che gli comunica la sua passione. " +
            "Dopo un fugace incontro con Jenny che canta a Memphis, Gump va a combattere in Vietnam.";

    private String mRegia = "Bino Cicogna";

    //Constructor
    public Movies (String titolo, String genere, int locandina, int anno){

        mTitolo = titolo;
        mGenere = genere;
        mIdLocandina = locandina;
        mLocandina = decodeSampledBitmapFromResource(MainActivity.getContext().getResources(), locandina, 90, 135);
        mAnno = anno;
    }


    protected Movies(Parcel in) {
        mTitolo = in.readString();
        mGenere = in.readString();
        mLocandina = in.readParcelable(Bitmap.class.getClassLoader());
        mAnno = in.readInt();
    }

    public static final Creator<Movies> CREATOR = new Creator<Movies>() {
        @Override
        public Movies createFromParcel(Parcel in) {
            return new Movies(in);
        }

        @Override
        public Movies[] newArray(int size) {
            return new Movies[size];
        }
    };

    public String getTitolo() {
        return mTitolo;
    }

    public String getGenere() {
        return mGenere;
    }

    public int getIdLocandina(){
        return mIdLocandina;
    }

    public Bitmap getImage() {
        return mLocandina;
    }

    public int getAnno() {
        return mAnno;
    }

    public String getTrama(){
        return mTrama;
    }

    public String getRegia(){
        return mRegia;
    }

    public String toString(){
        String s = "";
        s = getTitolo() + " " + getGenere() + " " + getRegia() + " " + getAnno();
        return s;
    }

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }


    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                         int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mTitolo);
        dest.writeString(mGenere);
        dest.writeParcelable(mLocandina, flags);
        dest.writeInt(mAnno);
    }
}
if (m.toString().toLowerCase().contains(constraint.toString().toLowerCase())) {
   tempList.add(m);
}
if (results.count == 0) {
    notifyDataSetInvalidated();
}
public void filter(CharSequence text){
    String query = text.toString().toLowerCase();
    tempMovies.clear();
    if(text.length() == 0){
        tempMovies.addAll(originalMoviesList);
    } else{
        for(Movies m : originalMoviesList){
            if(m.toString().toLowerCase().contains(query)){
                tempMovies.add(m);
            }
        }
    }
    notifyDataSetChanged();
}