过滤的列表项打开原始列表项的活动

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中单击列表活动时将列表项的静态图像和文本发送到下一个活动

单击另一个活动时如何发送自定义arraylist的列表项的数据?

创建新的重复记录表并发送到目标文件夹

具有 .every() 等效项的 Mongoose 聚合