英文:
ListView showing wrong item name after filtering
问题
I am new in android apps development. 我是新手在安卓应用程序开发方面。
I am learning coding from YouTube. 我正在从YouTube学习编程。
Below is my customListView code containing OnItemClick Listener and Action Bar searcView. 以下是我的自定义ListView代码,包含OnItemClick监听器和Action Bar搜索视图。
Everything is okay but the problem is after filtering. 一切都没问题,但问题是在过滤之后。
I am not getting the right item name on Toast after filtering. 在过滤后,我无法正确获取Toast上的项目名称。
it always takes data from my array source I have written in the ArrayItemlist. 它总是从我在ArrayItemlist中编写的数组源获取数据。
I know there is a similar question here but I sorry not to implement those in the same way. 我知道这里有一个类似的问题,但我抱歉没有以相同的方式实施它们。
I have searched everywhere I can but didn't get the right way I wanted. 我已经搜索了我能找到的每个地方,但没有找到我想要的正确方法。
At last, I have registered at StackOverflow and this is my first post. 最后,我在StackOverflow注册了帐户,这是我的第一篇帖子。
Please help me. 请帮助我。
Maybe the solution is about 3 or 4 lines. 也许解决方案大约是3或4行。
Please instruct me on the coding. 请指导我编码。
public class MainActivity extends AppCompatActivity {
private ListView listView;
ArrayList<allCountry> items = new ArrayList<>(); //item are countries
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listViewId);
ArrayList<allCountry> detail = new ArrayList<>(); //detail are the short description after item.
items.add(new allCountry("Bangladesh", "Is My Motherland", R.drawable.bangladesh));
items.add(new allCountry("India", "The Seven Wonder", R.drawable.india));
items.add(new allCountry("Pakistan", "The Traitor 71", R.drawable.pakistan));
items.add(new allCountry("Afghanistan", "The Ghost Cricket Team", R.drawable.afghanistan));
items.add(new allCountry("Sri Lanka", "The Mountain", R.drawable.srilanka));
items.add(new allCountry("Bhutan", "No Smoking Zone", R.drawable.bhutan));
items.add(new allCountry("Nepal", "The Buddhist", R.drawable.nepal));
items.add(new allCountry("Maldives", "Oh! Island", R.drawable.maldives));
items.add(new allCountry("Argentina", "The Hero Maradona", R.drawable.argentina));
items.add(new allCountry("Brazil", "The Hero Pele", R.drawable.brazil));
items.add(new allCountry("Canada", "The Hero Trudo", R.drawable.canada));
items.add(new allCountry("Mexico", "The Beautiful City", R.drawable.mexico));
items.add(new allCountry("Uganda", "To be Described", R.drawable.uganda));
listView.setAdapter(new customAdapter(MainActivity.this, R.layout.my_list_item, items, detail));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View countryNames, int position, long l) {
// Here is the problem. it needs update position
Toast.makeText(MainActivity.this, items.get(position).countryNames, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_menu, menu);
MenuItem menuItem = menu.findItem(R.id.SearchMenuId);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
ArrayList<allCountry> result = new ArrayList<>();
for (allCountry x : items) {
if (x.countryNames.toLowerCase().trim().contains(newText) ||
x.countryNames.toUpperCase().trim().contains(newText)) {
result.add(x);
}
}
((customAdapter) listView.getAdapter()).update(result);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
///CustomAdapter.java
public class customAdapter extends ArrayAdapter {
ArrayList<allCountry> items;
ArrayList<allCountry> detail;
public customAdapter(Context context, int layout, ArrayList<allCountry> items, ArrayList<allCountry> detail) {
super(context, layout);
this.items = items;
this.detail = detail;
}
public void update(ArrayList<allCountry> result) {
items = new ArrayList<>();
items.addAll(result);
notifyDataSetChanged();
}
public class ViewHolder {
TextView textView;
ImageView imageView;
TextView textView1;
}
@Override
public int getCount() {
return items.size();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View row;
row = convertView;
ViewHolder viewHolder;
if (convertView == null) {
row = LayoutInflater.from(getContext()).inflate(R.layout.my_list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.imageView = row.findViewById(R.id.imageViewId);
viewHolder.textView = row.findViewById(R.id.countryNamesTextViewId);
viewHolder.textView1 = row.findViewById(R.id.showDetailsTextViewId);
row.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) row.getTag();
}
viewHolder.imageView.setImageResource(items.get(position).flags);
viewHolder.textView.setText(items.get(position).countryNames);
viewHolder.textView1.setText(items.get(position).showDetails);
return row;
}
}
///allcountry.java
public class allCountry {
String countryNames;
String showDetails;
int flags;
public allCountry(String countryNames, String showDetails, int flags) {
this.countryNames = countryNames;
this.flags = flags;
this.showDetails = showDetails;
}
}
英文:
I am new in android apps development. I am learning coding from YouTube. Below is my customListView code containing OnItemClick Listener and Action Bar searcView. Everything is okay but the problem is after filtering. I am not getting the right item name on Toast after filtering. it always takes data from my array source I have written in the ArrayItemlist. I know there is a similar question here but I sorry not to implement those in the same way. I have searched everywhere i can but didn't get the right way I wanted. At last, I have registered at StackOverflow and this is my first post. Please help me. Maybe the solution is about 3 or 4 lines. Please instruct me on the coding.
public class MainActivity extends AppCompatActivity {
private ListView listView;
ArrayList<allCountry> items=new ArrayList<>(); //item are countries
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listViewId);
ArrayList<allCountry> detail= new ArrayList<>(); //detail are the short description after item.
items.add(new allCountry("Bangladesh","Is My Motherland",R.drawable.bangladesh));
items.add(new allCountry("India","The Seven Wonder",R.drawable.india));
items.add(new allCountry("Pakistan","The Traitor 71",R.drawable.pakistan));
items.add(new allCountry("Afghanistha","The Ghost Cricket Team",R.drawable.afghanistan));
items.add(new allCountry("Sri Lanka","The Mountain",R.drawable.srilanka));
items.add(new allCountry("Bhutan","No Smoking Zone",R.drawable.bhutan));
items.add(new allCountry("Nepal","The Buddhist",R.drawable.nepal));
items.add(new allCountry("Maldivs","Oh! Island",R.drawable.maldives));
items.add(new allCountry("Argentina","The Hero Maradona",R.drawable.argentina));
items.add(new allCountry("Brazil","The Hero Pele",R.drawable.brazil));
items.add(new allCountry("Canada","The Hero Trudo",R.drawable.canada));
items.add(new allCountry("Mexico","The Beautiful City",R.drawable.mexico));
items.add(new allCountry("Uganda","To be Described",R.drawable.uganda));
listView.setAdapter(new customAdapter(MainActivity.this,R.layout.my_list_item,items,detail));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View countryNames, int position, long l) {
// Here is the problem. it needs update position
Toast.makeText(MainActivity.this,items.get(position).countryNames,Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_menu,menu);
MenuItem menuItem=menu.findItem(R.id.SearchMenuId);
SearchView searchView= (SearchView) menuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
ArrayList<allCountry> result=new ArrayList<>();
for (allCountry x: items){
if (x.countryNames.toLowerCase().trim().contains(newText)||
x.countryNames.toUpperCase().trim().contains(newText)){
result.add(x);
}
}
( (customAdapter) listView.getAdapter()).update(result);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
///CustomAdapter.java
public class customAdapter extends ArrayAdapter {
ArrayList<allCountry>items;
ArrayList<allCountry> detail;
public customAdapter (Context context, int layout, ArrayList<allCountry> items,ArrayList<allCountry>
detail){
super(context,layout);
this.items=items;
this.detail=detail;
}
public void update(ArrayList<allCountry> result){
items=new ArrayList<>();
items.addAll(result);
notifyDataSetChanged();
}
public class ViewHolder{
TextView textView;
ImageView imageView;
TextView textView1;
}
@Override
public int getCount() {
return items.size();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View row;
row=convertView;
ViewHolder viewHolder;
if (convertView==null){
row= LayoutInflater.from(getContext()).inflate(R.layout.my_list_item,parent,false);
viewHolder=new ViewHolder();
viewHolder.imageView=row.findViewById(R.id.imageViewId);
viewHolder.textView=row.findViewById(R.id.countryNamesTextViewId);
viewHolder.textView1=row.findViewById(R.id.showDetailsTextViewId);
row.setTag(viewHolder);
}
else {
viewHolder= (ViewHolder) row.getTag();
}
viewHolder.imageView.setImageResource(items.get(position).flags);
viewHolder.textView.setText(items.get(position).countryNames);
viewHolder.textView1.setText(items.get(position).showDetails);
return row;
}
}
///allcountry.java
public class allCountry {
String countryNames;
String showDetails;
int flags;
public allCountry(String countryNames, String showDetails,int flags){
this.countryNames=countryNames;
this.flags=flags;
this.showDetails=showDetails;
}
}
答案1
得分: 0
在getView方法中的一种方法是将以下代码放入其中:
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), items.get(position).countryNames, Toast.LENGTH_SHORT).show();
}
});
然后移除OnItemClickListener。
英文:
One way would be to put inside getView:
row.setOnClickListener(.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(),items.get(position).countryNames,Toast.LENGTH_SHORT).show();
}
});
and remove OnItemClickListener
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论