带有搜索过滤器的列表视图适配器 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();
}
}
我正在尝试制作一个应用程序,该应用程序将在单击时显示 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();
}
}