搜索过滤列表视图后如何开始新的意图?

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,您解决了一个困扰我一个多月的问题。如果我可能会问,您所做的事情背后的理论是什么,是否有链接可以阅读所有相关信息(以便更好地理解您的解决方案)?再次谢谢你呜呜呜!!! :)

以上是关于搜索过滤列表视图后如何开始新的意图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Flutter(2021)中创建过滤器搜索列表视图

如何在搜索表视图后使用 indexPath 在主表视图中选择 RowAtIndexPath?

过滤列表视图后的项目混乱

从联系人意图添加联系人后如何刷新列表视图?

如何在android中的简单列表视图上使用startsWith应用搜索过滤器

我如何使用意图从列表视图转到下一个活动? [复制]