How to refer to the original position of a list item when text filter is enabled?

后端 未结 4 891
甜味超标
甜味超标 2021-01-15 13:58

When I use edit text to filter the items, the list positions get all messed up and the items no longer call the proper intent. Any help is appreciated

lv.se         


        
相关标签:
4条回答
  • 2021-01-15 14:16
     flashsearchList.setOnItemClickListener(new OnItemClickListener() {
    
            @Override 
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Integer temp=flashSearchNameMap.get(adapter.getItem(position));
    
                navigateSearch(temp); 
    
    
    
            }
        }); 
    

    (adapter.getItem(position) will return you the exact list name and in flashSearchNameMap i have stored names and position at beginning from oncreate before applying filtering.So you can get exact position by this

    0 讨论(0)
  • 2021-01-15 14:23

    The item position is not reliable when using lists. I recommend you to use view.setTag(Object) to assign an identifier to each item when attaching the content. This could be a number, string or anything. Then you can just access it with view.getTag() inside the click listener.

    0 讨论(0)
  • 2021-01-15 14:23

    if you use ViewHolder in Adapter just define a realPosition variable in holder class and set it in YourAdapter.getView

    and in listClick Listener

     ContactAdapter.ViewHolder holder = (YourAdapter.ViewHolder) view.getTag();
     holder.realPosition
    
    0 讨论(0)
  • 2021-01-15 14:29

    Assuming you are using a custom bean object to store your name & website values and an ArrayAdapter to show them in your ListView, like so

    public class NamedLink {
        final String mName;
        final String mWebsite; 
        public NamedLink(String name, String website) {
            mName = name;
            mWebsite = website;
        }
        @Override
        public String toString() {
            return mName;
        }
    }
    

    With an adapter, defined something like this:

    mAdapter = new ArrayAdapter<NamedLink>(this, android.R.layout.simple_list_item_2, mLinks) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    convertView = LayoutInflater.from(WhateverYourActivityIsNamed.this).inflate(android.R.layout.simple_list_item_2, null);
                }
                NamedLink link = getItem(position);
                // This probably deserves a ViewHolder
                ((TextView) convertView.findViewById(android.R.id.text1)).setText(link.getName());
                ((TextView) convertView.findViewById(android.R.id.text2)).setText(link.getWebsite());
                return convertView;
            }
        };
    

    When you filter the array adapter it will match against the beans #toString(), which in this case returns the name. When filtered, the array adapter maintains a properly indexed copy of your list of beans internally - i.e. you can use the position you get in the click listener like this:

    getListView().setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // getItemAtPosition() will return a NamedLink from the filtered
                // list maintained inside the ArrayAdapter
                NamedLink link = (NamedLink) parent.getItemAtPosition(position);
                Intent openDetails = new Intent(Test.this, ResourceDetails.class);
                Bundle b = new Bundle();            
                b.putString("name", link.getName());
                b.putString("web", link.getWebsite());
                openDetails.putExtras(b);
                startActivity(openDetails);  
            }
        });
    
    0 讨论(0)
提交回复
热议问题