Android - ListView - performItemClick

前端 未结 24 1163
清歌不尽
清歌不尽 2020-11-29 03:10

I\'m facing some difficults when I try to use the performItemClick funcion of the ListView.

All I want to do is to perform a click programatically i

相关标签:
24条回答
  • 2020-11-29 03:57

    This worked for me.

    listView.performItemClick(
        listView.getAdapter().getView(position, null, null), position, position);
    

    use the adapter to get the view for the position of the item. The other 2 parameters I didn't want so I left them null. Leaving convertView null causes the adapter to render a new view. It's a performance issue but since this is only happening once in a while it wont have much effect. I don't need to specify the parent for anything because I'm not using it.

    position is just the spot where your item is located. Additionally these 2 lines of code before your performItemClick create the illusion of having the list item selected. They also ensure the appropriate item is on the screen.

    listView.requestFocusFromTouch();
    listView.setSelection(position);
    
    0 讨论(0)
  • 2020-11-29 03:59

    When using Listview (simple array adapter or custom adapter) define listview and other finally make perform click.

    For example:

     //At onCreate function:
    
    lv = (ListView) findViewById(R.id.listView);
            lv.setAdapter(new CustomAdapter(List_item.this, list, images));
    
    
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id)    {
    // on click function works
        }
    }
    
    
    int position = 0;
    lv.performItemClick(lv.getAdapter().getView(position, null, null), position, lv.getAdapter().getItemId(position));
    

    Note: After creating the setOnItemClickListener only you should call perform click. Otherwise, it will not correctly.

    0 讨论(0)
  • 2020-11-29 03:59

    This works for me:

    listview.getSelectedView().performClick();
    
    0 讨论(0)
  • 2020-11-29 04:00

    myListView.getChildAt(0) returns null because used this very soon.

    use a delay for it.

    or use below code:

    private class MyAdapter extends BaseAdapter
    {
    private final Context context;
    private HashMap<Integer, View> views;
    
    public MyAdapter(Context context)
    {
        this.context = context;
        views = new HashMap<>();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if(convertView == null)
        {
            if(views.get(position) == null)
            {
                final LayoutInflater layoutInflater = LayoutInflater.from(context);
                convertView = layoutInflater.inflate(R.layout.my_grid, null, false);
    
                views.put(position, convertView);
            }
            else
                convertView = views.get(position);
        }
    
        TextView tv = convertView.findViewById(R.id.langView);
        tv.setText(languageList.get(position));
    
        return convertView;
    }
    }
    

    and

    adapter = new MyAdapter(getActivity());
    myListView.setAdapter(adapter);
    
    Runnable r = new Runnable()
    {
        @Override
        public void run()
        {
            myListView.performItemClick(adapter.getView(position, null, myListView), position, 0);
        }
    };
    
    myListView.postDelayed(r, 100);
    
    0 讨论(0)
  • 2020-11-29 04:01

    Try this one:

    public static boolean performClicKOnLisViewFromIndex(ListView listView, int index){
            if(listView != null){
                if(listView.getAdapter()!= null && listView.getAdapter().getCount() >0 && listView.getAdapter().getCount() > index ){
                    listView.performItemClick(
                            listView.getAdapter().getView(index, null, null),
                            index, listView.getItemIdAtPosition(index));
                    return true;
                }
            }
            return  false;
        }
    
    0 讨论(0)
  • 2020-11-29 04:01

    If you would get weird result when using getView, this is because the list item you want does not exist within visible parts. Use below:

    private View getViewFromAdapterByPosition(int position, ListView listView) 
    {
            View view;
            int firstVisiblePos = listView.getFirstVisiblePosition();
            int lastVisiblePos = listView.getLastVisiblePosition();
    
            if (position < firstVisiblePos || position > lastVisiblePos) {
                view = listView.getAdapter().getView(position, null, listView);
            } else {
                view = listView.getChildAt(position - firstVisiblePos);
            }
            return view;
        }
    

    And then,

    listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);
    
    0 讨论(0)
提交回复
热议问题