ListView 在筛选后显示错误的项目名称。

huangapple go评论29阅读模式
英文:

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&lt;allCountry&gt; items=new ArrayList&lt;&gt;();  //item are countries
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listViewId);
ArrayList&lt;allCountry&gt; detail= new ArrayList&lt;&gt;();  //detail are the short description after item.
items.add(new allCountry(&quot;Bangladesh&quot;,&quot;Is My Motherland&quot;,R.drawable.bangladesh));
items.add(new allCountry(&quot;India&quot;,&quot;The Seven Wonder&quot;,R.drawable.india));
items.add(new allCountry(&quot;Pakistan&quot;,&quot;The Traitor 71&quot;,R.drawable.pakistan));
items.add(new allCountry(&quot;Afghanistha&quot;,&quot;The Ghost Cricket Team&quot;,R.drawable.afghanistan));
items.add(new allCountry(&quot;Sri Lanka&quot;,&quot;The Mountain&quot;,R.drawable.srilanka));
items.add(new allCountry(&quot;Bhutan&quot;,&quot;No Smoking Zone&quot;,R.drawable.bhutan));
items.add(new allCountry(&quot;Nepal&quot;,&quot;The Buddhist&quot;,R.drawable.nepal));
items.add(new allCountry(&quot;Maldivs&quot;,&quot;Oh! Island&quot;,R.drawable.maldives));
items.add(new allCountry(&quot;Argentina&quot;,&quot;The Hero Maradona&quot;,R.drawable.argentina));
items.add(new allCountry(&quot;Brazil&quot;,&quot;The Hero Pele&quot;,R.drawable.brazil));
items.add(new allCountry(&quot;Canada&quot;,&quot;The Hero Trudo&quot;,R.drawable.canada));
items.add(new allCountry(&quot;Mexico&quot;,&quot;The Beautiful City&quot;,R.drawable.mexico));
items.add(new allCountry(&quot;Uganda&quot;,&quot;To be Described&quot;,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&lt;?&gt; 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&lt;allCountry&gt; result=new ArrayList&lt;&gt;();
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&lt;allCountry&gt;items;
ArrayList&lt;allCountry&gt; detail;
public  customAdapter (Context context, int layout, ArrayList&lt;allCountry&gt; items,ArrayList&lt;allCountry&gt; 
detail){
super(context,layout);
this.items=items;
this.detail=detail;
}
public void update(ArrayList&lt;allCountry&gt; result){
items=new ArrayList&lt;&gt;();
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

huangapple
  • 本文由 发表于 2020年7月31日 19:19:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/63190905.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定