Java 带有GridView的SearchView小部件。我在搜索字段中键入,但它不为n';不要刷新GridView
我不熟悉编码。我正在尝试实现一个SearchView小部件,它应该更新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;
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();
}