我在定制搜索上花了太多时间
任何人都可以告诉我,我将如何在我的code.Plz帮助中实现它
我已经在列表中获取数据,我有编辑框,但我不知道,它将如何实现在使用Filterable类或我将如何使用
此代码中为addTextChangedListener(){}
。
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
我的代码是 MainSearch.java ,我将获得列表。
在此次通话中,我将实施搜索代码。 我有点想法,如果我将所有列表项保存在arrayList中,并将所有这些值与editText值进行比较。它可以提供解决方案。不确定。
public class MainSEarch extends Activity {
// Progress Dialog
private ProgressDialog pDialog;
ListView list;
LazyAdapter adapter;
// Connection detector
ConnectionDetector cd;
// Alert dialog manager
AlertDialogManager alert = new AlertDialogManager();
ArrayList<HashMap<String, String>> contactList;
// Search EditText
EditText inputSearch;
int textlength = 0;
// url to make request
String url = "URl NOT HERE But like as http://api.androidhive.info/contacts/";
// JSON Node names
static final String TAG_CONTACTS = "userinfo";
static final String TAG_ID = "id";
static final String TAG_NAME = "name";
static final String TAG_EMAIL = "email";
static final String TAG_PHONE = "cb_phonenumber";
// contacts JSONArray
JSONArray userinfo = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.list_search);
inputSearch = (EditText) findViewById(R.id.editText1); // Search Box
cd = new ConnectionDetector(getApplicationContext());
// Check for internet connection
if (!cd.isConnectingToInternet()) {
// Internet Connection is not present
alert.showAlertDialog(MainSEarch.this, "Internet Connection Error",
"Please connect to working Internet connection", false);
// stop executing code by return
return;
}
// Hashmap for ListView
contactList = new ArrayList<HashMap<String, String>>();
// Loading Agents list JSON in Background Thread
new LoadAgentList().execute();
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//what should I do in this method.plz provide some solutions.
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* Background Async Task to Load all Albums by making http request
* */
class LoadAgentList extends AsyncTask<String, String, String>
{
/** *
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainSEarch.this);
pDialog.setMessage("Agents List ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);
try{
// Getting Array of Contacts
userinfo = json.getJSONArray(TAG_CONTACTS);
// looping through All Contacts
for(int i = 0; i < userinfo.length(); i++){
JSONObject c = userinfo.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String mobile = c.getString(TAG_PHONE);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_EMAIL, email);
map.put(TAG_PHONE, mobile);
// adding HashList to ArrayList
contactList.add(map);
}
}
catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String file_url) {
// dismiss the dialog after getting all albums
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
list=(ListView)findViewById(R.id.mylist);
// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(MainSEarch.this,contactList);
list.setAdapter(adapter);
}
});
}
}
我的第二课 LazyAdapter :这将展示如何getView() 方法膨胀视图以及惰性列表将如何工作代码 我在这堂课中做了什么
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.list_item, null);
TextView name = (TextView)vi.findViewById(R.id.name); // name
TextView email = (TextView)vi.findViewById(R.id.email); // email
TextView phone = (TextView)vi.findViewById(R.id.mobile); // phone
HashMap<String, String> song = new HashMap<String, String>();
song = data.get(position);
// Setting all values in listview
name.setText(song.get(MainSEarch.TAG_NAME));
email.setText(song.get(MainSEarch.TAG_EMAIL));
phone.setText(song.get(MainSEarch.TAG_PHONE));
return vi;
}
}
我的代码应该有什么变化,我的搜索将会执行。 Plz我是Android的初学者。 在此先感谢
答案 0 :(得分:1)
看看这个例子。希望你能得到一个主意。使用Textwatcher。 http://abdennour-insat.blogspot.in/2012/05/listview-textwatcher-autocomplete.html
答案 1 :(得分:0)
我使用以下代码从我的自定义列表视图中过滤数据。看看它,如果你可以在你的情况下实现它,dcheck,
adapter = new CustomListViewAdapter(this,R.layout.list_row, rowItems);
listView.setAdapter(adapter);
listView.setTextFilterEnabled(true);
并且根据编辑文本过滤搜索,我使用了
editText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
}
public void afterTextChanged(Editable arg0) {
ActivityName.this.adapter.getFilter().filter(arg0);
}
});
答案 2 :(得分:0)
你必须在自定义适配器中实现自己的过滤器,这里是一个样本(非常简单):
public Filter getFilter() {
Log.d("Filter", "BeginFilter");
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence arg0, FilterResults arg1) {
Log.d("Filter", "publishResults");
mGuides = (ArrayList<Guide>)arg1.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.d("Filter","Perform filtering");
constraint = constraint.toString().toLowerCase();
ArrayList<Guide> filteredGuides = new ArrayList<Guide>();
for (int i = 0; i < mGuides.size(); i++)
{
Guide newGuide = mGuides.get(i);
if (newGuide.getName().toLowerCase().contains(constraint))
filteredGuides.add(newGuide);
}
FilterResults filterResults = new FilterResults();
filterResults.count = filteredGuides.size();
filterResults.values = filteredGuides;
return filterResults;
}
};
}
你可以从活动中这样称呼它:
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
adapter.getFilter().filter(arg0);
}