gpt4 book ai didi

android - 在 Android 中搜索 ListView 项后,始终打开 ListView 的第一项(问题)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:05 25 4
gpt4 key购买 nike

当我打开搜索到的项目时,它打开的是 ListView 的第一项而不是搜索到的项目。即使成功搜索并找到项目。

举个例子:

  • 如果我搜索 Arrow,我可以获得 Arrow,但是当单击 Arrow 时,它会变成 Almost Human code>,Almost Human 是我的 ListView 的第一项
  • 如果我搜索 American,我会得到 The Americans(第一个)American Horror Story(第二个)(两个结果)搜索过程成功,但如果单击 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();
}

希望你能帮助我..

最佳答案

通常,如果您有一个自定义类型的 ArrayAdapter,如 RowItem,它不会自动为您处理过滤。毕竟,它怎么知道要过滤 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 响应中...

关于android - 在 Android 中搜索 ListView 项后,始终打开 ListView 的第一项(问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com