带有搜索过滤器的列表视图适配器 class 在搜索时未发送准确位置

Listview Adapter class with search filter not sending exact position while searching

我正在尝试制作一个应用程序,该应用程序将在单击时显示 ListView 行的详细信息。我为搜索选项添加了一个过滤器和三个 EditText

如果我使用所有选项进行搜索,我的应用程序会显示一个成员三次,这就是为什么我在 filter() 方法中注释掉两个条件。

但主要问题是,当我搜索成员时,它搜索得很好,但是当单击搜索结果时,ListView 行的位置似乎发生了变化。例如,如果我找到三个搜索结果,第一个在位置 0,第二个在位置 1,第三个在位置 2。

Listview 单击事件无需搜索即可正常工作。

我需要过滤之前的旧位置,以便通过 Intent 将其发送到另一个 Activity,这将为每个成员显示不同的数据。

ListViewAdapter.java class `

public class ListViewAdapter extends BaseAdapter {

// Declare Variables
Context mContext;
LayoutInflater inflater;
private List<WorldPopulation> worldpopulationlist = null;
private ArrayList<WorldPopulation> arraylist;

public ListViewAdapter(Context context, List<WorldPopulation> worldpopulationlist) {
    mContext = context;
    this.worldpopulationlist = worldpopulationlist;
    inflater = LayoutInflater.from(mContext);
    this.arraylist = new ArrayList<WorldPopulation>();
    this.arraylist.addAll(worldpopulationlist);
}

public class ViewHolder {
    TextView rank;
    TextView country;
    TextView population;
    ImageView flag;
}

@Override
public int getCount() {
    return worldpopulationlist.size();
}
@Override
public WorldPopulation getItem(int position) {
    return worldpopulationlist.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

public View getView(final int position, View view, final ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.listview_item, null);
        // Locate the TextViews in listview_item.xml
        holder.rank = (TextView) view.findViewById(R.id.rank);
        holder.country = (TextView) view.findViewById(R.id.country);
        holder.population = (TextView) view.findViewById(R.id.population);
        // Locate the ImageView in listview_item.xml
        holder.flag = (ImageView) view.findViewById(R.id.flag);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    // Set the results into TextViews
    holder.rank.setText(worldpopulationlist.get(position).getRank());
    holder.country.setText(worldpopulationlist.get(position)
          .getCountry());
    holder.population.setText(worldpopulationlist.get(position)
          .getPopulation());
    // Set the results into ImageView
    holder.flag.setImageResource(worldpopulationlist.get(position)
                    .getFlag());

    // Listen for ListView Item Click
    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Intent summaryIntent = new Intent(mContext,
                    SecondActivity.class);
            Bundle b = new Bundle();
            b.putInt("Integer", position);
            summaryIntent.putExtras(b);
            mContext.startActivity(summaryIntent);
            Toast.makeText(mContext, "Position:" + position,
                            Toast.LENGTH_SHORT).show();

           Intent intent = new Intent(mContext, SecondActivity.class);
           // Send single item click data to SingleItemView Class
           // depending on "position", for example

           // Pass all data rank
           //  intent.putExtra("rank",
           //      (worldpopulationlist.get(position).getRank()));
           // ...likewise pass all other data ...

           mContext.startActivity(intent);

        }
    });

    return view;
}

// Filter Class
public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    worldpopulationlist.clear();
    if (charText.length() == 0) {
        worldpopulationlist.addAll(arraylist);
    } else {
        for (WorldPopulation wp : arraylist) {
            if (wp.getCountry().toLowerCase(Locale.getDefault())
                    .contains(charText) ) {
                worldpopulationlist.add(wp);
            }
            if(wp.getRank().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                worldpopulationlist.add(wp);
            }
            if (wp.getPopulation().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                worldpopulationlist.add(wp);
            }
        }
    }
    notifyDataSetChanged();
}

}

为了在 onCLick() 方法中获取项目的 "old" 位置,请使用

arraylist.indexOf( getItem(position) )

像这样更改您的过滤方法以避免多次添加相同的项目:

// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
worldpopulationlist.clear();
if (charText.length() == 0) {
    worldpopulationlist.addAll(arraylist);
} 
else {
    boolean addToList;

    for (WorldPopulation wp : arraylist) {
        addToList = false;

        if (wp.getCountry().toLowerCase(Locale.getDefault())
                 .contains(charText) ) {
            addToList = true;
        }
        if(wp.getRank().toLowerCase(Locale.getDefault())
                  .contains(charText)) {
            addToList = true;
        }
        if (wp.getPopulation().toLowerCase(Locale.getDefault())
                   .contains(charText)) {
            addToList = true;
        }

        // now add the item to your list if it matches the search criteria
        if (addToList) {                      
            worldpopulationlist.add(wp);
        }

    }
    notifyDataSetChanged();
}

}