当我打开搜索到的项目时,它打开ListView的第一项而不是搜索到的项目。即使搜索并成功找到项目。
让我举个例子:
Arrow
,我可以获得Arrow
,但点击Arrow
后会转到Almost Human
,Almost Human
是我的第一项的ListView American
,我会The Americans (first)
和American Horror Story (second)
(两个结果)
搜索过程成功,但如果单击The Americans (second one)
,它将转到ListView的第二项。我错过了什么?
我的搜索代码:
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
MainActivity.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
}
这里是CustomListViewAdapter.java
public class CustomListViewAdapter extends ArrayAdapter<RowItem> {
Context context;
public CustomListViewAdapter(Context context, int resourceId,
List<RowItem> items) {
super(context, resourceId, items);
this.context = context;
}
/* private view holder class */
private class ViewHolder {
ImageView imageView;
TextView txtTitle;
TextView txtDesc;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
RowItem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtDesc.setText(rowItem.getDesc());
holder.txtTitle.setText(rowItem.getTitle());
// holder.imageView.setImageBitmap(rowItem.getImageId());
ImageView img = (ImageView) convertView.findViewById(R.id.icon);
ImageView gif = (ImageView) convertView.findViewById(R.id.icon);
// UrlImageViewHelper.loadUrlDrawable(context, rowItem.getImageId());
Ion.with(gif).load("http://www.example.com/wp-content/uploads/2014/03/android-icon/loading.gif");
Drawable drawable=gif.getDrawable();
UrlImageViewHelper.setUrlDrawable(img, rowItem.getImageId(),drawable,
600000);
return convertView;
}
}
RowItem.java
public class RowItem<T> {
private String imageId;
private String title;
private String desc;
public RowItem(String imageId, String title, String desc) {
this.imageId = imageId;
this.title = title;
this.desc = desc;
}
public String getImageId() {
return imageId;
}
public void setImageId(String imageId) {
this.imageId = imageId;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return title + "\n" + desc;
}
}
MainActiviy.java
protected void onCreate(Bundle onSaveInstanceState ) {
super.onCreate(onSaveInstanceState );
setContentView(R.layout.activity_main);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, Open the Next Screen
Intent r = new Intent(MainActivity.this, KategoriActivity.class);
r.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
r.putExtra("cat_img", asd[2][position]);
r.putExtra("cat_id", asd[1][position]);
r.putExtra("cat_id2", asd[1][position]);
r.putExtra("cat_name",asd[0][position]);
// r.putExtra("cat_img", bit[1][position]);
startActivityForResult(r, position);
}
});
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
JSONArray jsonResponse = new JSONArray(result);
asd = new String[3][jsonResponse.length()];
rowItems = new ArrayList<RowItem>();
for (int i = 0; i < jsonResponse.length(); i++) {
JSONObject js = jsonResponse.getJSONObject(i);
asd[0][i] = js.getString("Category_Name");
asd[2][i] = js.getString("Image");
asd[1][i] = js.getString("Term_ID");
RowItem item = new RowItem(asd[2][i], asd[0][i], "");
rowItems.add(item);
}
adapter = new CustomListViewAdapter(MainActivity.this,
R.layout.list_item, rowItems);
listView.setAdapter(adapter);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
希望你能帮帮我..
答案 0 :(得分:3)
通常,如果你有一个类似RowItem
的自定义类型的ArrayAdapter,它就不会自动为你处理过滤。毕竟,它怎么知道RowItem
的哪个属性要过滤?您应该覆盖getFilter
方法,并将筛选后的列表与适配器中的整个列表分开存储。像这样:
public class CustomListViewAdapter extends ArrayAdapter<RowItem>
{
private final ArrayList<RowItem> mItems;
private ArrayList<RowItem> mFilteredItems;
private final Comparator<Object> mComparator;
public CustomListViewAdapter(Context context, int textViewResourceId, List<RowItem> items)
{
super(context, textViewResourceId);
mItems = new ArrayList<RowItem>(items);
mFilteredItems = new ArrayList<RowItem>(items);
mComparator = new Comparator<Object>()
{
@Override
public int compare(Object o1, Object o2)
{
String s1 = ((RowItem)o1).getTitle();
String s2 = ((RowItem)o2).getTitle();
return s1.toLowerCase(Locale.getDefault()).compareTo(s2.toLowerCase());
}
};
Collections.sort(mItems, mComparator);
Collections.sort(mFilteredItems, mComparator);
}
@Override
public int getCount()
{
return mFilteredItems.size();
}
@Override
public RowItem getItem(int position)
{
return mFilteredItems.get(position);
}
@Override
public int getPosition(RowItem item)
{
return mFilteredItems.indexOf(item);
}
@Override
public Filter getFilter()
{
return new Filter()
{
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
mFilteredItems = (ArrayList<RowItem>)results.values;
if (results.count > 0)
{
notifyDataSetChanged();
}
else
{
notifyDataSetInvalidated();
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
List<RowItem> filteredResults = new ArrayList<RowItem>();
for (RowItem item : mItems)
{
if (item.getTitle().toLowerCase(Locale.getDefault()).contains(constraint.toString().toLowerCase(Locale.getDefault())))
{
filteredResults.add(item);
}
}
Collections.sort(filteredResults, mComparator);
FilterResults results = new FilterResults();
results.values = filteredResults;
results.count = filteredResults.size();
return results;
}
};
}
}
并在MainActivity中:
RowItem item = adapter.getItem(position)
r.putExtra("cat_img", item.getImageId());
r.putExtra("cat_id", item.getTermId());
r.putExtra("cat_id2", item.getTermId());
r.putExtra("cat_name", item.getTitle());
您还必须向RowItem添加一个termid字段,因为它在您的JSON响应中...
答案 1 :(得分:1)
Inside ArrayAdapter是两个列表:包含所有项目的原始列表,以及适配器将为其创建视图的当前项目列表。最初,这两个列表具有相同的项目。在适配器上过滤时,原始列表将继续保留所有项目,但由于过滤器,用于显示的列表将更改。删除过滤器后,当前的项目列表将再次更改以反映原始列表。
假设您有五个项目。过滤后,列表仅显示最后一项。那么这些列表的状态是
currentItems: { item5 }
originalItems: { item1 , item2 , item3 , item4 , item5 }
单击此项时,ListView将报告单击位置0
。这是因为显示的列表只有一个项目。如果您在当前列表中的位置0处查找了该项目,则会得到item5
。但是,如果您在原始列表的位置0 中查找该项目,您将获得item1
,这是不所单击项目的数据。
我怀疑你有一个对原始列表的引用,并且正在使用它来获取项目数据,即使列表已被过滤。而是使用adapter.getItem(position)
,它应该为您提供正确的项目。
答案 2 :(得分:1)
我使用这样的东西,它对我来说很好。我在我的列表onsitemclick中使用字符串值来搜索和显示所需的活动
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String itemValue = (String) list.getItemAtPosition(position);
if (itemValue == "INDIA") {
Intent intent = new Intent(MainActivity.this, india.class);
startActivity(intent);}
else if (itemValue == "CHINA") {
Intent intent = new Intent(MainActivity.this, china.class);
startActivity(intent);}
else if (itemValue == "IRAQ") {
Intent intent = new Intent(MainActivity.this, usa.class);
startActivity(intent);
}
}
答案 3 :(得分:1)
here
例如,如果您的适配器类是##
class CustomAdapetr(Context context,ArrayList<RowItem>list_item){}
//mainactivity
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// HERE IS YOUR ITEM ID:):)
int clickedItem=list_item.indexOf(parent.getAdapter().getItem(position));
}
});
欢呼!!!!快乐的编码