过滤的列表项打开原始列表项的活动
Posted
技术标签:
【中文标题】过滤的列表项打开原始列表项的活动【英文标题】:Filtered list item opens the original list items' activity 【发布时间】:2015-12-16 07:21:01 【问题描述】:在这里和其他任何地方搜索大量时间后,我都没有希望找到解决方案。
所以这是我的问题。
我创建了一个列表视图,并在此之上添加了一个搜索栏。
当我使用搜索栏过滤结果时...当我点击项目 7 时,而不是打开特定的点击活动,即 7,它总是从第一个开始。
我期待着你们的帮助;因为我需要它!
【问题讨论】:
说真的,这是问题 Tasos,标题吗? 您无法根据您的案例中的位置开始另一个活动,因此请尝试根据单击的项目某些唯一标识打开另一个活动。 嗨,Haresh,您能否详细说明您所说的内容?有各种各样的例子吗? 【参考方案1】:public class Group extends ListActivity
// ArrayList thats going to hold the search results
ArrayList<HashMap<String, Object>> searchResults;
// ArrayList that will hold the original Data
ArrayList<HashMap<String, Object>> originalValues;
LayoutInflater inflater;
@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);
final EditText searchBox = (EditText) findViewById(R.id.searchBox);
ListView playersListView = (ListView) findViewById(android.R.id.list);
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// these arrays are just the data that
// I'll be using to populate the ArrayList
String names[] = /*list of names*/ ;
String teams[] = /*list of teams*/;
Integer[] photos = R.drawable.... /*list of drawables*/;
Integer[] id =/*Position*/;
originalValues = new ArrayList<HashMap<String, Object>>();
// temporary HashMap for populating the Items in the ListView
HashMap<String, Object> temp;
// total number of rows in the ListView
int noOfPlayers = names.length;
// now populate the ArrayList players
for (int i = 0; i < noOfPlayers; i++)
temp = new HashMap<String, Object>();
temp.put("name", names[i]);
temp.put("team", teams[i]);
temp.put("photo", photos[i]);
temp.put("id", id[i]);
// add the row to the ArrayList
originalValues.add(temp);
// searchResults=OriginalValues initially
searchResults = new ArrayList<HashMap<String, Object>>(originalValues);
final CustomAdapter adapter = new CustomAdapter(this, R.layout.players, searchResults);
// finally,set the adapter to the default ListView
playersListView.setAdapter(adapter);
searchBox.addTextChangedListener(new TextWatcher()
public void onTextChanged(CharSequence s, int start, int before, int count)
// get the text in the EditText
String searchString = searchBox.getText().toString();
int textLength = searchString.length();
// clear the initial data set
searchResults.clear();
for (int i = 0; i < originalValues.size(); i++)
String playerName = originalValues.get(i).get("name").toString();
if (textLength <= playerName.length())
// compare the String in EditText with Names in the
// ArrayList
if (searchString.equalsIgnoreCase(playerName.substring(0, textLength)))
searchResults.add(originalValues.get(i));
adapter.notifyDataSetChanged();
public void beforeTextChanged(CharSequence s, int start, int count, int after)
public void afterTextChanged(Editable s)
);
// listening to single list item on click
playersListView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
int pos=Integer.ParseInt(searchResults.get(position).get("id").toString());
switch (pos)
case 0:
Intent newActivity = new Intent(TeamsList.this, Barca.class);
startActivity(newActivity);
break;
case 1:
etc...
);
自定义适配器类:
private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>
public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings)
// let android do the initializing :)
super(context, textViewResourceId, Strings);
// class for caching the views in a row
private class ViewHolder
ImageView photo;
TextView name, team;
ViewHolder viewHolder;
@Override
public View getView(int position, View convertView, ViewGroup parent)
if (convertView == null)
convertView = inflater.inflate(R.layout.players, null);
viewHolder = new ViewHolder();
// cache the views
viewHolder.photo = (ImageView) convertView.findViewById(R.id.photo);
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.team = (TextView) convertView.findViewById(R.id.team);
//Take one textview in listview design named id
viewHolder.id = (TextView) convertView.findViewById(R.id.id);
// link the cached views to the convert view
convertView.setTag(viewHolder);
else
viewHolder = (ViewHolder) convertView.getTag();
int photoId = (Integer) searchResults.get(position).get("photo");
// set the data to be displayed
viewHolder.photo.setImageDrawable(getResources().getDrawable(photoId));
viewHolder.name.setText(searchResults.get(position).get("name").toString());
viewHolder.team.setText(searchResults.get(position).get("team").toString());
viewHolder.id.setText(searchResults.get(position).get("id").toString());
// return the view to be displayed
return convertView;
【讨论】:
我更改了您的代码中的某些内容。希望它有效。当您使用实体在文本视图中设置数据时,它很容易完成 感谢您的回复! :-)根据您的建议,我夸大了 Integer[] id =/*Position*/; 的行与我所有的 R.layouts (如果我错了,请给我一个 1 /2 行的例子来说明如何做到这一点)。一旦我保存了一个干净的项目,我会收到以下错误:1)这一行的多个标记 - id 无法解析或者不是代码行中的字段://在名为 id viewHolder.id 的列表视图设计中获取一个文本视图= (TextView) convertView.findViewById(R.id.id);和2)id无法解析或者不是字段,在viewHolder.id.setText(searchResults.get(position).get("id").toString()); ImageView 照片; TextView 名称、团队、id;像这样在viewholder中声明id 嗨 akhil,当我按照你说的做时,确实可以解决问题。只剩下一件事,它在以下行中: viewHolder.id = (TextView) convertView.findViewById(R.id.id);错误:id 无法解析或不是字段...是 xml 文件中的错误(我还包含了上面的 xml 文件)?再次感谢 是的,尝试了目前建议的所有方法,但似乎没有任何效果【参考方案2】:我认为您无法在列表视图项目点击上找到正确的位置。所以你可以使用一个可见性=“Gone”的文本视图,并在每一行中插入该文本视图中的位置。现在您可以在单击具有显示完美位置的 textview 值的项目时轻松访问位置。希望它有效。谢谢
【讨论】:
viewHolder.id = (TextView) convertView.findViewById(R.id.id);在 viewholder 中添加一个 textview 并将该 textview 的文本设置到该位置。我认为它有效。 首先,你说得对,这是我的问题。另外,如果问的不多,你能告诉我如何在上面的特定代码中做到这一点,因为我几天来一直在努力寻找解决方案,现在感到绝望。谢谢你,我为所有的麻烦道歉【参考方案3】:问题是适配器填充了一次,但搜索结果它被搜索的项目overViewed所以点击它指的是列表的原始项目而不是过滤列表一次,所以我们必须使用过滤列表的位置而不是原来的,我也遇到了这个问题,试试这个:
在你的 listView.setOnItemClickListener
playersListView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
//Object objFilteredItem = parent.getItemAtPosition(position);
//String a = searchResults.get(position);
switch (Integer.parseInt((String) adapter.getItem(position)))
case 0:..
Intent newActivity = new Intent(TeamsList.this,Barca.class);
startActivity(newActivity);
break;
case 1:
etc...
break;
);
【讨论】:
【参考方案4】:根据我之前回答的问题here,您必须覆盖CustomAdapter
中的getItem(position)
方法。您在某种程度上正确设置了 onItemClick
,但列表适配器不知道它究竟从 getItem(position)
得到什么。
编辑(详细信息):您需要在自定义适配器中添加类似的内容 -
@Override
public Object getItem(int position)
return list.get(position);
您的自定义适配器中应该已经有list
。如果没有,您可以将列表引用添加到您的CustomAdapter
:
private ArrayList<HashMap<String, Object>> list;
然后在 Group
活动中使用 setter 设置它:
customAdapter.setList(searchResults);
【讨论】:
还有@justarandomguy,您可能想重新考虑使用ArrayAdapter
。阅读:***.com/questions/11650121/…以上是关于过滤的列表项打开原始列表项的活动的主要内容,如果未能解决你的问题,请参考以下文章
在android中单击列表活动时将列表项的静态图像和文本发送到下一个活动