尝试使用edittext搜索listview项目,点击搜索到的项目返回错误的位置。
假设我从给定列表中搜索“C”,其中列表项如下“A”,“B”,“C”,“D”,“CC”,并获得正确的搜索结果但是一旦点击搜索项目,返回错误的项目位置。
这里是Edittext addTextChangedListener:
edtSearch.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
adapter.notifyDataSetChanged();
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
}
完整的课程代码:
package com.tomar.xyz;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class Tabtwo extends Activity implements OnItemClickListener {
ListView listView;
TextView txt;
ArrayAdapter<String> adapter;
// Search EditText
EditText edtSearch;
// Array of strings storing country names
String[] countries = new String[] { "Admin Cost", "Affinity Diagram",
"Analyse", "Apprasal Costs", "Assessment of Stakeholders",
};
// Array of integers points to images stored in /res/drawable-ldpi/
int[] flags = new int[] { R.drawable.admin, R.drawable.affinity,
R.drawable.analysis, R.drawable.appraisal, R.drawable.assessment,
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabtwo);
// Each row in the list stores country name, currency and flag
List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < 4; i++) {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("txt", countries[i]);
hm.put("flag", Integer.toString(flags[i]));
aList.add(hm);
}
// Keys used in Hashmap
String[] from = { "flag", "txt" };
// Ids of views in listview_layout
int[] to = { R.id.flag, R.id.txt };
// Instantiating an adapter to store each items
// R.layout.listview_layout defines the layout of each item
final SimpleAdapter adapter = new SimpleAdapter(getBaseContext(),
aList, R.layout.listview_layout, from, to);
// Getting a reference to listview of main.xml layout file
ListView listView = (ListView) findViewById(R.id.listview);
edtSearch = (EditText) findViewById(R.id.Search_box);
txt = (TextView) findViewById(R.id.txt);
listView.setOnItemClickListener(this);
// Setting the adapter to the listView
listView.setAdapter(adapter);
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(this);
edtSearch.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
adapter.notifyDataSetChanged();
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
if (position == 0) {
Intent int0 = new Intent(getApplicationContext(), Admincost.class);
startActivity(int0);
}
if (position == 1) {
Intent int1 = new Intent(getApplicationContext(), Affinity.class);
startActivity(int1);
}
if (position == 2) {
Intent int2 = new Intent(getApplicationContext(), Analyse.class);
startActivity(int2);
}
if (position == 3) {
Intent int3 = new Intent(getApplicationContext(),
ApprasalCosts.class);
startActivity(int3);
}
if (position == 4) {
Intent int1 = new Intent(getApplicationContext(), Assessment.class);
startActivity(int1);
} }
}
}
答案 0 :(得分:0)
参考此代码: -
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
ArrayList<String> STOREID_SUB = new ArrayList<String>();
ArrayList<String> STORE_NAME_SUB = new ArrayList<String>();
ArrayList<String> PHOTO_SUB = new ArrayList<String>();
ArrayList<String> PLACE_STATUS_SUB = new ArrayList<String>();
final ArrayList<String> STORE_DESC_SUB = new ArrayList<String>();
textlength = searchText.getText().length();
for (int i = 0; i < STORE_NAME.size(); i++)
{
if (textlength <= STORE_NAME.get(i).length())
{
if (searchText.getText().toString().
equalsIgnoreCase((String) STORE_NAME.get(i).subSequence(0, textlength)))
{
STORE_NAME_SUB.add(STORE_NAME.get(i));
STOREID_SUB.add(STOREID.get(i));
PHOTO_SUB.add(PHOTO.get(i));
STORE_DESC_SUB.add(STORE_DESC.get(i));
PLACE_STATUS_SUB.add(PLACE_STATUS.get(i));
}
}
}
adapter=new StoreSearchListAdapter(context, R.drawable.ic_launcher, R.drawable.ic_launcher, STORE_NAME_SUB, PHOTO_SUB,STORE_DESC_SUB,PLACE_STATUS_SUB);
singlePlaceChooserList.setAdapter(adapter);
}
这里我在onTextCahnged方法中创建一个新的arraylist,然后使用这些值来设置我的适配器。
答案 1 :(得分:0)
将onItemClick更改为:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method
if (((String)adapter.getItem(position)).equals("Admin Cost")) {
Intent int0 = new Intent(getApplicationContext(), Admincost.class);
startActivity(int0);
}
.........................
}
当您过滤列表时,项目会重新排列并更改其位置,因此请根据该位置的值而不是位置导航到下一个活动。