Я пытаюсь создать приложение, которое будет отображать информацию о строке ListView
при нажатии. Я добавил фильтр и три EditText
для параметров поиска.
Если я использую все параметры для поиска, мое приложение показывает одного члена три раза, поэтому я закомментировал два условия в методе filter().
Но основная проблема заключается в том, что когда я ищу участника, он ищет хорошо, но при нажатии на результат поиска кажется, что положение строки ListView
изменилось. Например, если я нашел три результата поиска, первый находится на позиции 0, второй — на позиции 1, а третий — на позиции 2.
Событие click Listview отлично работает без поиска.
Мне нужна старая позиция, какой она была до фильтрации, чтобы отправить ее через Intent
другому Activity
, который будет показывать разные данные для каждого члена.
Класс ListViewAdapter.java `
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();
}
}