如何通过列表视图筛选 [英] How to filter by listview
本文介绍了如何通过列表视图筛选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想过滤到基于上微调列表视图。
例如,我有一个code为ListView控件是
(新加坡探知馆
新加坡科学中心
造币博物馆
新加坡美术馆
军事博物馆)。
我有一个code的微调是
(中心
新加坡,
博物馆)。
我想拥有的是:当点击新加坡,在ListView,它会过滤掉所有的新加坡
(新加坡探知馆
新加坡科学中心
新加坡艺术博物馆)。
我尝试了我的这个编码,
你能来指导我,有什么错呢?
MainActivity.java
公共抽象类MainActivity扩展ListActivity实现OnItemSelectedListener { 的String []分类= {
新加坡发现中心,
新加坡科学中心
造币博物馆
新加坡美术馆
军事博物馆
};的String [] =关键字{
中央,
博馆,
新加坡,};微调S1;
ListView控件列表视图; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
列表视图=(ListView控件)findViewById(R.id.listView1);
S1 =(微调)findViewById(R.id.spinner1); s1.setOnItemSelectedListener(本); setListAdapter(新ArrayAdapter<串GT;(这一点,android.R.layout.simple_list_item_1,类别)); ArrayAdapter<串GT; AA =新ArrayAdapter<串GT;(这一点,android.R.layout.simple_spinner_item,关键词); aa.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(AA);
} 公共无效onItemSelected(适配器视图<>母公司,视图V,INT位置,
长ID){
listview.setFilterText(分类[位置]);
}
公共无效onNothingSelected(适配器视图<>母公司){
listview.setFilterText();
}公共无效onListItemClick(ListView的父母,视图V,INT位置,长的ID)
{
Toast.makeText(这一点,你已经选择了+分类[位置],Toast.LENGTH_SHORT).show();
}
}
logcat的:
07-29 14:43:30.429:E / AndroidRuntime(30599):致命异常:主要
07-29 14:43:30.429:E / AndroidRuntime(30599):了java.lang.RuntimeException:无法实例活动ComponentInfo {com.example.spinnertest / com.example.spinnertest.MainActivity}:java.lang.InstantiationException:COM .example.spinnertest.MainActivity
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.os.Handler.dispatchMessage(Handler.java:99)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.os.Looper.loop(Looper.java:130)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread.main(ActivityThread.java:3691)
07-29 14:43:30.429:E / AndroidRuntime(30599):在java.lang.reflect.Method.invokeNative(本机方法)
07-29 14:43:30.429:E / AndroidRuntime(30599):在java.lang.reflect.Method.invoke(Method.java:507)
07-29 14:43:30.429:E / AndroidRuntime(30599):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:912)
07-29 14:43:30.429:E / AndroidRuntime(30599):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
07-29 14:43:30.429:E / AndroidRuntime(30599):在dalvik.system.NativeStart.main(本机方法)
07-29 14:43:30.429:E / AndroidRuntime(30599):java.lang.InstantiationException:产生的原因com.example.spinnertest.MainActivity
07-29 14:43:30.429:E / AndroidRuntime(30599):在java.lang.Class.newInstanceImpl(本机方法)
07-29 14:43:30.429:E / AndroidRuntime(30599):在java.lang.Class.newInstance(Class.java:1409)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.Instrumentation.newActivity(Instrumentation.java:1024)
07-29 14:43:30.429:E / AndroidRuntime(30599):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
07-29 14:43:30.429:E / AndroidRuntime(30599):... 11个
解决方案
您将不得不使用一个自定义的适配器和一个自定义过滤器。
删除摘要
为你的类。
row.xml
<?XML版本=1.0编码=UTF-8&GT?;
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent> <的TextView
机器人:ID =@ + ID / textView1
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_alignParentTop =真
机器人:layout_centerHorizontal =真
机器人:layout_marginTop =19dp
机器人:文字=TextView的/>< / RelativeLayout的>
MainActivity.java
公共类MainActivity扩展ListActivity工具
OnItemSelectedListener { 的String []分类= {新加坡发现中心,
新加坡科学中心,造币博物馆,新加坡美术馆
军事博物馆}; 的String [] =关键字{中心,馆,新加坡 };
ArrayList的<串GT;猫=新的ArrayList<串GT;();
ArrayList的<串GT; mPostingData =新的ArrayList<串GT;();
微调S1;
ListView控件列表视图;
CustomAdapter CUS; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
列表视图=(ListView控件)findViewById(R.id.listView1);
S1 =(微调)findViewById(R.id.spinner1);
的for(int i = 0; I< Category.length;我++){
cat.add(分类[I]);
} // AA =新
// ArrayAdapter<串GT;(这一点,android.R.layout.simple_list_item_1,类别);
s1.setOnItemSelectedListener(本);
mPostingData =猫;
的for(int i = 0; I< mPostingData.size();我++){
如果(mPostingData.size()大于0)
Log.i(DATAS,mPostingData.get(ⅰ));
}
CUS =新CustomAdapter(这一点,0);
setListAdapter(CUS); ArrayAdapter<串GT; AA =新ArrayAdapter<串GT;(这一点,
android.R.layout.simple_spinner_item,关键词); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(AA);
} 公共无效onItemSelected(适配器视图<>母公司,视图V,INT位置,
长ID){
// listview.setFilterText(分类[位置]);
字符串文本= s1.getSelectedItem()的toString()。
。cus.getFilter()过滤器(文本);
cus.notifyDataSetChanged();
} 公共无效onNothingSelected(适配器视图<>母公司){
// listview.setFilterText();
} 公共无效onListItemClick(ListView的父母,视图V,INT位置,长的id){
Toast.makeText(这一点,你已经选择了+ mPostingData.get(位置),
Toast.LENGTH_SHORT).show();
} 类CustomAdapter扩展ArrayAdapter<串GT; { 公共无效使用setData(ArrayList的<串GT; mPpst){
mPostingData = mPpst; //包含类项目的数据。
} @覆盖
公共过滤用getFilter(){
返回新过滤器(){
@覆盖
保护无效publishResults(CharSequence的约束,
FilterResults结果){
如果(结果= NULL&放大器;!&安培; results.count> = 0){
使用setData((ArrayList的<串GT;)results.values);
}其他{
使用setData(猫); //设置初始值
} notifyDataSetInvalidated();
} @覆盖
保护FilterResults performFiltering(CharSequence的约束){
FilterResults结果=新FilterResults();
如果(!TextUtils.isEmpty(约束)){
约束= constraint.toString();
ArrayList的<串GT; foundItems =新的ArrayList<串GT;();
如果(猫!= NULL){
的for(int i = 0; I< cat.size();我++){ 如果(cat.get(I)。载有(约束)){
的System.out.println(我的DATAS+ cat.get(I));
foundItems.add(cat.get(I)); }其他{ }
}
}
result.count = foundItems.size(); //搜索结果找到
//返回计数
result.values = foundItems; //返回值
}其他{
result.count = -1; //没有找到搜索结果
} 返回结果;
}
};
} LayoutInflater mInflater; 公共CustomAdapter(上下文的背景下,诠释textViewResourceId){
超(背景下,textViewResourceId);
// TODO自动生成构造函数存根
mInflater =(LayoutInflater)上下文
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} @覆盖
公众诠释的getCount(){
// TODO自动生成方法存根
返回mPostingData.size();
} @覆盖
众长getItemId(INT位置){
// TODO自动生成方法存根
返回的位置;
} @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
// TODO自动生成方法存根
ViewHolder VH;
如果(convertView == NULL){
VH =新ViewHolder();
convertView = mInflater.inflate(R.layout.row,NULL);
vh.t1 =(TextView中)convertView.findViewById(R.id.textView1); convertView.setTag(VH);
}其他{
//获取ViewHolder回才能到TextView的快速访问
//和ImageView的。
VH =(ViewHolder)convertView.getTag();
}
如果(mPostingData.size()大于0)
vh.t1.setText(mPostingData.get(位置));
返回convertView;
} } 静态类ViewHolder {
TextView的T1;
}
}
模拟器抓拍
I would like to filter into listview based on Spinner.
For example, I've a code for ListView which is
("Singapore Discovery Centre",
"Singapore Science Centre",
"Mint Museum",
"Singapore Art Museum",
"Army Museum").
I've a code for Spinner which is
("Centre",
"Singapore",
"Museum").
What I would like to have is: Upon clicking Singapore, in the listview, it will filter out all the "Singapore"
("Singapore Discovery Centre",
"Singapore Science Centre",
"Singapore Art Museum" ).
I tried out this coding of mine,
Could you be guide me, what is wrong with it?
MainActivity.java
public abstract class MainActivity extends ListActivity implements OnItemSelectedListener {
String[] Category = {
"Singapore discovery Centre",
"Singapore Science Centre",
"Mint Museum",
"Singapore Art Museum",
"Army Museum"
};
String [] keywords = {
"Centre",
"Musuem",
"Singapore",
};
Spinner s1;
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listView1);
s1 = (Spinner) findViewById(R.id.spinner1);
s1.setOnItemSelectedListener(this);
setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Category));
ArrayAdapter<String> aa = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, keywords);
aa.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(aa);
}
public void onItemSelected(AdapterView<?> parent, View v, int position,
long id) {
listview.setFilterText(Category[position]);
}
public void onNothingSelected(AdapterView<?> parent) {
listview.setFilterText("");
}
public void onListItemClick(ListView parent, View v, int position,long id)
{
Toast.makeText(this, "You have selected " + Category[position], Toast.LENGTH_SHORT).show();
}
}
Logcat:
07-29 14:43:30.429: E/AndroidRuntime(30599): FATAL EXCEPTION: main
07-29 14:43:30.429: E/AndroidRuntime(30599): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.spinnertest/com.example.spinnertest.MainActivity}: java.lang.InstantiationException: com.example.spinnertest.MainActivity
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.os.Looper.loop(Looper.java:130)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread.main(ActivityThread.java:3691)
07-29 14:43:30.429: E/AndroidRuntime(30599): at java.lang.reflect.Method.invokeNative(Native Method)
07-29 14:43:30.429: E/AndroidRuntime(30599): at java.lang.reflect.Method.invoke(Method.java:507)
07-29 14:43:30.429: E/AndroidRuntime(30599): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
07-29 14:43:30.429: E/AndroidRuntime(30599): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
07-29 14:43:30.429: E/AndroidRuntime(30599): at dalvik.system.NativeStart.main(Native Method)
07-29 14:43:30.429: E/AndroidRuntime(30599): Caused by: java.lang.InstantiationException: com.example.spinnertest.MainActivity
07-29 14:43:30.429: E/AndroidRuntime(30599): at java.lang.Class.newInstanceImpl(Native Method)
07-29 14:43:30.429: E/AndroidRuntime(30599): at java.lang.Class.newInstance(Class.java:1409)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.Instrumentation.newActivity(Instrumentation.java:1024)
07-29 14:43:30.429: E/AndroidRuntime(30599): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
07-29 14:43:30.429: E/AndroidRuntime(30599): ... 11 more
解决方案
You will have to use a custom Adapter and a custom filter.
Remove the abstract
for you class.
row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="19dp"
android:text="TextView" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends ListActivity implements
OnItemSelectedListener {
String[] Category = { "Singapore discovery Centre",
"Singapore Science Centre", "Mint Museum", "Singapore Art Museum",
"Army Museum" };
String[] keywords = { "Centre", "Museum", "Singapore",
};
ArrayList<String> cat = new ArrayList<String>();
ArrayList<String> mPostingData = new ArrayList<String>();
Spinner s1;
ListView listview;
CustomAdapter cus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listView1);
s1 = (Spinner) findViewById(R.id.spinner1);
for (int i = 0; i < Category.length; i++) {
cat.add(Category[i]);
}
// aa = new
// ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Category);
s1.setOnItemSelectedListener(this);
mPostingData = cat;
for (int i = 0; i < mPostingData.size(); i++) {
if (mPostingData.size() > 0)
Log.i("Datas", mPostingData.get(i));
}
cus = new CustomAdapter(this, 0);
setListAdapter(cus);
ArrayAdapter<String> aa = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, keywords);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(aa);
}
public void onItemSelected(AdapterView<?> parent, View v, int position,
long id) {
// listview.setFilterText(Category[position]);
String Text = s1.getSelectedItem().toString();
cus.getFilter().filter(Text);
cus.notifyDataSetChanged();
}
public void onNothingSelected(AdapterView<?> parent) {
// listview.setFilterText("");
}
public void onListItemClick(ListView parent, View v, int position, long id) {
Toast.makeText(this, "You have selected " + mPostingData.get(position),
Toast.LENGTH_SHORT).show();
}
class CustomAdapter extends ArrayAdapter<String> {
public void setData(ArrayList<String> mPpst) {
mPostingData = mPpst;// contains class items data.
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results != null && results.count >= 0) {
setData((ArrayList<String>) results.values);
} else {
setData(cat);// set original values
}
notifyDataSetInvalidated();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
if (!TextUtils.isEmpty(constraint)) {
constraint = constraint.toString();
ArrayList<String> foundItems = new ArrayList<String>();
if (cat != null) {
for (int i = 0; i < cat.size(); i++) {
if (cat.get(i).contains(constraint)) {
System.out.println("My datas" + cat.get(i));
foundItems.add(cat.get(i));
} else {
}
}
}
result.count = foundItems.size();// search results found
// return count
result.values = foundItems;// return values
} else {
result.count = -1;// no search results found
}
return result;
}
};
}
LayoutInflater mInflater;
public CustomAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
// TODO Auto-generated constructor stub
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mPostingData.size();
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder vh;
if (convertView == null) {
vh = new ViewHolder();
convertView = mInflater.inflate(R.layout.row, null);
vh.t1 = (TextView) convertView.findViewById(R.id.textView1);
convertView.setTag(vh);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
vh = (ViewHolder) convertView.getTag();
}
if (mPostingData.size() > 0)
vh.t1.setText(mPostingData.get(position));
return convertView;
}
}
static class ViewHolder {
TextView t1;
}
}
Emulator snap shots
这篇关于如何通过列表视图筛选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文