搜索过滤列表视图后如何开始新的意图?
Posted
技术标签:
【中文标题】搜索过滤列表视图后如何开始新的意图?【英文标题】:How to start new intent after search-filtering listview? 【发布时间】:2016-01-29 02:03:39 【问题描述】:大家好,我有一个问题:
我创建了一个列表视图,带有搜索栏等。因此,当我单击一个项目(通过 switch-case)时,所选的新活动打开并且没有问题。
您可以在此处查看代码:
Filtered list item opens the original list items' activity
当我使用搜索栏过滤列表视图时,问题就开始了,而不是打开选定的活动(让我们说活动 10),它让我回到活动 1 等等。
到目前为止,我发现很可能 CustomAdapter 以某种方式混合了我的活动并且不知道选择了哪个活动;因此,它让我回到了起点。
各位,我已经尝试了一个多月来解决这个问题,但仍然没有希望。
任何帮助表示赞赏。
【问题讨论】:
发布您的 customadapter 代码。 嗨 fabin,如果您单击上面的链接,您将被重定向到代码,只需向下滚动一点(在 switch-case 之后)。 xml等我都包含了,给大家一个全貌。 对不起,我没有看到那部分.. 【参考方案1】:在您的代码中,您已经根据列表视图的位置给出了点击事件。例如: 玩家 = "test1","test2","test3"
CASE 1:当什么都没有被搜索到时: 第一个位置有玩家test1
案例2:当用户搜索test2。 现在 listview 搜索 test2 并只找到一个实例,而 searchlist 将只有一个玩家,它将位于第一个位置。由于您已根据位置给出点击事件,因此第一行将始终带到巴萨
更新:
您需要如下更改您的代码
Group.java
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
public class Group extends ListActivity
ArrayList<Players> originalValues;
LayoutInflater inflater;
int noOfPlayers = 10;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.grouplist);
final EditText searchBox = (EditText) findViewById(R.id.searchBox);
ListView playersListView = (ListView) findViewById(android.R.id.list);
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
originalValues = new ArrayList<Players>();
for (int i = 0; i < noOfPlayers; i++)
// here you initialise the class with your own data
Players players = new Players(i, "name" + i, "team", R.drawable.ic_launcher);
originalValues.add(players);
final CustomAdapter adapter = new CustomAdapter(this, R.layout.players, originalValues);
playersListView.setAdapter(adapter);
searchBox.addTextChangedListener(new TextWatcher()
public void onTextChanged(CharSequence s, int start, int before, int count)
String searchString = searchBox.getText().toString();
int textLength = searchString.length();
adapter.clearSearchResult();
for (int i = 0; i < originalValues.size(); i++)
String playerName = originalValues.get(i).getName();
if (textLength <= playerName.length())
// compare the String in EditText with Names in the
// ArrayList
if (searchString.equalsIgnoreCase(playerName.substring(0, textLength)))
adapter.addSeachResult(originalValues.get(i));
adapter.notifyDataSetChanged();
public void beforeTextChanged(CharSequence s, int start, int count, int after)
public void afterTextChanged(Editable s)
);
playersListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
switch ((int) adapter.getItemId(position))
case 0:
Intent newActivity = new Intent(Group.this, Barca.class);
startActivity(newActivity);
break;
case 1:
etc
);
CustomAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
class CustomAdapter extends BaseAdapter
ArrayList<Players> searchResults;
ViewHolder viewHolder;
public CustomAdapter(Context context, int textViewResourceId, ArrayList<Players> results)
searchResults = new ArrayList<>(results);
@Override
public View getView(int position, View convertView, ViewGroup parent)
if (convertView == null)
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.players, null);
viewHolder = new ViewHolder();
viewHolder.photo = (ImageView) convertView.findViewById(R.id.photo);
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.team = (TextView) convertView.findViewById(R.id.team);
convertView.setTag(viewHolder);
else
viewHolder = (ViewHolder) convertView.getTag();
int photoId = (Integer) searchResults.get(position).getPicture();
viewHolder.photo.setImageDrawable(parent.getContext().getResources().getDrawable(photoId));
viewHolder.name.setText(searchResults.get(position).getName());
viewHolder.team.setText(searchResults.get(position).getTeam());
return convertView;
public void clearSearchResult()
searchResults.clear();
public void addSeachResult(Players result)
this.searchResults.add(result);
private class ViewHolder
ImageView photo;
TextView name, team;
@Override
public int getCount()
return searchResults.size();
@Override
public Object getItem(int position)
return searchResults.get(position);
@Override
public long getItemId(int position)
return searchResults.get(position).getId();
名为 Player.java 的新类
public class Players
public Players(int id,String name,String team,int picture)
this.id = id;
this.name = name;
this.team = team;
this.picture = picture;
private int id;
private String name;
private String team;
private int picture;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getTeam()
return team;
public void setTeam(String team)
this.team = team;
public int getPicture()
return picture;
public void setPicture(int picture)
this.picture = picture;
public int getId()
return id;
【讨论】:
Hi Fabin .... 该列表包含 30 名玩家(!),而不仅仅是 2。当我按照您的描述更改我的代码时,我得到:“令牌“else”上的语法错误,删除这个令牌”。那么,我是否必须选择: if -else if - else if - else if - ... - else,嵌套语句?最后:在你的代码中,“test1”这个词是我写的完全一样还是我用别的东西来改变它? 我已经编辑了我的答案,并确保这次它会起作用.. :) 嗨,fabin,是的,它有效! :) 但是,现在原始代码中的所有数据都没有出现。例如,让我们说:名字“梅西,球队“巴萨”和他的可绘制/图片 - 所以,我得到的不是这些数据,而是一个列表:所有球员的启动器图标,出现“球队”这个词应该出现巴萨或皇马的地方,而不是“梅西”或“罗纳尔多”,我得到:name0、name 1 等。换句话说,我相信代码不会填充列表视图。我错过了什么还是我搞砸了? :( 我添加了一条评论,如果你注意到的话。在这里,我使用循环在 arraylist 中创建了 10 个播放器对象。您必须删除此循环并创建每个播放器并将其添加到原始值 我删除了我最后的 cmets。我明白你的意思,目前正在努力。到目前为止一切顺利;不管我是否必须添加大约 50 个原始值(在这个阶段我真的不介意)。尊敬的 Fabin,您解决了一个困扰我一个多月的问题。如果我可能会问,您所做的事情背后的理论是什么,是否有链接可以阅读所有相关信息(以便更好地理解您的解决方案)?再次谢谢你呜呜呜!!! :)以上是关于搜索过滤列表视图后如何开始新的意图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在搜索表视图后使用 indexPath 在主表视图中选择 RowAtIndexPath?