【发布时间】:2015-06-24 13:27:37
【问题描述】:
我在 android 中创建了一个简单的搜索视图。
当我在搜索视图中输入文本时,建议列表显示为空列表
我的代码 res/xml/searchable.xml
<?xml version="1.0" encoding="UTF-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search"
android:hint="@string/search_hint">
</searchable>
values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SearchViewDemo</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="search">Search</string>
<string name="search_hint">Search the dictionary</string>
<string name="title_activity_searchable">SearchableActivity</string>
</resources>
menu/searchable.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/search"
android:title="@string/search"
android:showAsAction="ifRoom"
android:actionViewClass="android.widget.SearchView" />
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
layout/activity_searchable.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SearchableActivity" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="120dp" >
</ListView>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.searchviewdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.searchviewdemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.searchviewdemo.SearchableActivity"
android:label="@string/title_activity_searchable" >
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data android:name="android.app.default_searchable"
android:value="com.example.searchviewdemo.SearchableActivity"/>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"></meta-data>
</activity>
</application>
</manifest>
SearchableActivity.java
package com.example.searchviewdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Build;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.database.MatrixCursor;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.Toast;
import android.annotation.TargetApi;
public class SearchableActivity extends Activity {
private List<String> items=null;
private Menu menu;
ListView mylist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
//loaddata();
items=new ArrayList<String>();
Bundle extras=getIntent().getExtras();
if(extras!=null)
{
for(int i=0;i<7;i++)
{
items.add(extras.getString("values["+i+"]"));
}
}
mylist=(ListView)findViewById(R.id.listView1);
/*Intent intent=getIntent();
if(Intent.ACTION_SEARCH.equals(intent.getAction()))
{
String query=intent.getStringExtra(SearchManager.QUERY);
loadHistory(query);
}*/
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.searchable, menu);
this.menu=menu;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
{
SearchManager manager=(SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView search=(SearchView)menu.findItem(R.id.search).getActionView();
search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
//search.setIconifiedByDefault(false);
search.setOnQueryTextListener(new OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String query) {
// TODO Auto-generated method stub
loadHistory(query);
//Toast.makeText(getApplicationContext(), "text changed", Toast.LENGTH_LONG).show();
return false;
}
@Override
public boolean onQueryTextSubmit(String arg0) {
// TODO Auto-generated method stub
return false;
}
});
}
return true;
}
//History
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void loadHistory(final String query1)
{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
{
String[] columns=new String[]{"_id","text"};
Object[] temp=new Object[]{"0","default"};
final MatrixCursor cursor=new MatrixCursor(columns);
for(int i=0;i<items.size();i++)
{
temp[0]=i;
temp[1]=items.get(i);
cursor.addRow(temp);
}
SearchManager manager=(SearchManager)getSystemService(Context.SEARCH_SERVICE);
final SearchView search=(SearchView)menu.findItem(R.id.search).getActionView();
search.setSuggestionsAdapter(new ExampleAdapter(getBaseContext(),cursor,items));
mylist.setAdapter(new ExampleAdapter(getBaseContext(),cursor,items));
}
}
}
ExampleAdapter.java
package com.example.searchviewdemo;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;
public class ExampleAdapter extends CursorAdapter {
private List<String> items;
private TextView text;
public ExampleAdapter(Context context,Cursor cursor,List<String> items)
{
super(context,cursor,false);
//this.items=new ArrayList<String>();
Log.e("msg","example adapter is called");
this.items=items;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
// TODO Auto-generated method stub
System.out.println("position"+cursor.getPosition()+":"+items.get(cursor.getPosition()));
text.setText(items.get(cursor.getPosition()));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// TODO Auto-generated method stub
System.out.println("new view is called");
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.item, parent, false);
text=(TextView)view.findViewById(R.id.item);
return view;
}
![This is my output][1]
}
我的列表值为(二、三、四、五、六、七、八) 我做错了什么,但不知道我做错了什么。 请任何人帮助解决这个问题
我的启动器活动
package com.example.searchviewdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Button button1;
List<String> items=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
items=new ArrayList<String>();
//items.add("one");
items.add("two");
items.add("three");
items.add("four");
items.add("five");
items.add("six");
items.add("seven");
items.add("eight");
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(MainActivity.this,SearchableActivity.class);
for(int i=0;i<items.size();i++)
{
intent.putExtra("values["+i+"]", items.get(i));
}
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
编辑搜索活动
SearchManager manager=(SearchManager)getSystemService(Context.SEARCH_SERVICE);
final SearchView search=(SearchView)menu.findItem(R.id.search).getActionView();
List<String> newlist=new ArrayList<String>();
for(int i=0;i<items.size();i++)
{
if(items.get(i).toString().trim().equals(query1))
{
newlist.add(items.get(i));
}
}
search.setSuggestionsAdapter(new ExampleAdapter(getBaseContext(),cursor,newlist));
【问题讨论】:
-
我认为在 searchableActivity 文件中设置适配器请查看该文件的最后几行
-
您的启动器活动在哪里??
-
感谢您的回复。现在我用启动器活动编辑我的问题@jitendra parmer
-
当搜索视图中的任何字符或单词类型,适配器填充所有项目时,我已经看到了您的代码。 (表示全部)不是可搜索的项目。
-
那么,您到底想要什么只有可搜索的项目适合适配器??
标签: android