[英]How to update listview during search
這是我啟動時的應用程序:
當我單擊列表視圖中的一項時,它將打開一個新活動並顯示一些數據。
當我搜索某些東西時,它看起來像這樣:
當我單擊列表中的一個項目時,它將啟動一個新活動。 但是開始的活動並不准確。
這是我的代碼:
HomeActivity.class
package com.thesis.herbalmedicines.activity;
import java.util.ArrayList;
import java.util.Arrays;
import android.app.Activity;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
public class HomeActivity extends BaseActivity implements
SearchView.OnQueryTextListener {
ListView lv;
SearchView search;
String[] herb_names, sample_arr; //= ["Boils","",""];//, iso_codes;
TypedArray herb_pics;
ArrayList<Home> homelist;
HomeAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.home_layout, frameLayout);
mDrawerList.setItemChecked(position, true);
setTitle(listArray[position]);
android.app.ActionBar ab = getActionBar();
ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#50B222"));
ab.setBackgroundDrawable(colorDrawable);
lv = (ListView) findViewById(R.id.list_view);
search = (SearchView) findViewById(R.id.search_view);
herb_names = getResources().getStringArray(R.array.herb_names);
//iso_codes = getResources().getStringArray(R.array.iso_Code);
herb_pics = getResources().obtainTypedArray(R.array.herb_pics);
homelist = new ArrayList<Home>();
for (int i = 0; i < herb_names.length; i++) {
Home home = new Home(herb_names[i], //iso_codes[i],
herb_pics.getResourceId(i, -1));
homelist.add(home);
}
adapter = new HomeAdapter(getApplicationContext(), homelist);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (position == 0) {
Intent a = new Intent(HomeActivity.this, Boils.class);
startActivity(a);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 1) {
Intent b = new Intent(HomeActivity.this, Cystitis.class);
startActivity(b);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 2) {
Intent c = new Intent(HomeActivity.this, Asthma.class);
startActivity(c);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 3) {
Intent d = new Intent(HomeActivity.this, Feet.class);
startActivity(d);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
});
search.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
}
家.java
package com.thesis.herbalmedicines.activity;
public class Home {
String name;
int pics;
Home(String name, int pics) {
this.name = name;
this.pics = pics;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPics() {
return pics;
}
public void setPics(int pics) {
this.pics = pics;
}
}
HomeAdapter.java
package com.thesis.herbalmedicines.activity;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
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.ImageView;
import android.widget.TextView;
public class HomeAdapter extends BaseAdapter implements Filterable {
Context context;
ArrayList<Home> homelist;
ArrayList<Home> mStringFilterList;
ValueFilter valueFilter;
HomeAdapter(Context context, ArrayList<Home> homelist) {
this.context = context;
this.homelist = homelist;
mStringFilterList = homelist;
}
@Override
public int getCount() {
return homelist.size();
}
@Override
public Object getItem(int position) {
return homelist.get(position);
}
@Override
public long getItemId(int position) {
return homelist.indexOf(getItem(position));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
TextView name_tv = (TextView) convertView.findViewById(R.id.name);
ImageView iv = (ImageView) convertView.findViewById(R.id.pic);
Home home = homelist.get(position);
name_tv.setText(home.getName());
iv.setImageResource(home.getPics());
}
return convertView;
}
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Home> filterList = new ArrayList<Home>();
for (int i = 0; i < mStringFilterList.size(); i++) {
if ((mStringFilterList.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Home home = new Home(mStringFilterList.get(i)
.getName(), mStringFilterList.get(i)
.getPics());
filterList.add(home);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = mStringFilterList.size();
results.values = mStringFilterList;
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
homelist = (ArrayList<Home>) results.values;
notifyDataSetChanged();
}
}
}
在每個onSerch上將adpter設置為listview
為什么要使用位置導航到其他活動?
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (position == 0) {
Intent a = new Intent(HomeActivity.this, Boils.class);
startActivity(a);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 1) {
Intent b = new Intent(HomeActivity.this, Cystitis.class);
startActivity(b);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 2) {
Intent c = new Intent(HomeActivity.this, Asthma.class);
startActivity(c);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if (position == 3) {
Intent d = new Intent(HomeActivity.this, Feet.class);
startActivity(d);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
});
search.setOnQueryTextListener(this);
}
每當適配器從搜索結果中刷新時,這將始終重置您的位置。
為了更好地做到這一點。 只需按照以下步驟在適配器中創建自定義偵聽器即可。
Public interface ListViewClick{
void onListClick(Object type)
}
在活動中注冊您的接收器並傳遞活動類型以從適配器啟動
private ListViewClick callback;
HomeAdapter(Context context, ArrayList<Home> homelist,ListViewClick callback) {
this.context = context;
this.homelist = homelist;
mStringFilterList = homelist;
this.callback = callback;
}
並在convertView
點擊偵聽器上傳遞callback.onListClick(//type of activity to launch)
。
只需參考“家庭實體發起的活動類型”即可。 因此,您可以在單擊列表視圖的特定行時識別出將啟動哪個活動。
添加一個字段,該字段包含要在Home
類中加載的類。 ( id
字段是可選的)
public class Home {
int id;
String name;
int pics;
Class clazz;
Home(int id, String name, int pics, Class clazz) {
this.id = id;
this.name = name;
this.pics = pics;
this.clazz = clazz;
}
// getters and setters
}
在初始化homelist
添加id
,
// the classed to load
Class[] classes = {
Boils.class,
Cystitis.class,
Asthma.class,
Feet.class
};
for (int i = 0; i < herb_names.length; i++) {
Home home = new Home(i, herb_names[i], herb_pics.getResourceId(i, -1), classes[i]);
homelist.add(home);
}
在setOnItemClickListener
內部,
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Home item = (Home) adapter.getItem(position);
Intent d = new Intent(HomeActivity.this, item.getClazz());
startActivity(d);
/** Fading Transition Effect */
HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
});
適配器也應進行幾處更改。
在getView
內部,您將convertView
強制為null。 這對性能不利。 (也考慮使用ViewHolder
)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
}
TextView name_tv = (TextView) convertView.findViewById(R.id.name);
ImageView iv = (ImageView) convertView.findViewById(R.id.pic);
Home home = homelist.get(position);
name_tv.setText(home.getName());
iv.setImageResource(home.getPics());
return convertView;
}
在publishResults
內部,您將為數據集創建一個新引用。 您應該更新現有數據集。
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
homelist.clear();
homelist.addAll((ArrayList<Home>) results.values);
notifyDataSetChanged();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.