user1022011
user1022011

Reputation:

Android - ListView - performItemClick

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 in the first item of the list.

How can I do that? I looked up that function in the documentation, but I didn't really understand its parameters.

I tried something like:

 myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());

But it didn't work (myListView.getChildAt(0) returns null)

Thank you in advance!

Upvotes: 46

Views: 43457

Answers (24)

AllanRibas
AllanRibas

Reputation: 1154

In my case, none of the options solved my problem, so I made an adaptation in my CursorAdapter class. I defined a global variable in the scope, so I just call the class changing this value and check the cursor position by passing the position value

 mProductsAdapter.currentPosition = requiredPosition

in my ProductsAdapter builder

  var currentPosition = 0

in bindView I do the check

 if (cursor.position == currentPosition) {
// perform action
}

Upvotes: 0

H.Fa8
H.Fa8

Reputation: 318

just should use performItemClick() and it's okay.

listView.performItemClick(listView.getAdapter().getView(listView.getSelectedItemId, null, null), listView.getSelectedItemId, listView.getAdapter().getItemId(listView.getSelectedItemId));

Upvotes: 0

Ali Bagheri
Ali Bagheri

Reputation: 3419

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);

Upvotes: 0

Maxime Claude
Maxime Claude

Reputation: 995

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;
    }

Upvotes: 0

User Learning
User Learning

Reputation: 3483

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.

Upvotes: 3

Drilon Kastrati
Drilon Kastrati

Reputation: 1

This worked for me:

listView.getAdapter().getView(1, null, null).performClick();

Upvotes: -1

hamidjahandideh
hamidjahandideh

Reputation: 207

This works for me:

listview.getSelectedView().performClick();

Upvotes: -1

sandeep negi
sandeep negi

Reputation: 9

This work for me 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);

Upvotes: 0

kenju
kenju

Reputation: 5954

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);

Upvotes: -1

HourGlass
HourGlass

Reputation: 1830

Dropping Some Experience.

using listview1.performItemClick, will also trigger your listview1.OnItemClickListener if you are using the listener with same listview in your code.

Hope It helps  

Upvotes: -1

nick9999
nick9999

Reputation: 37

mList.performItemClick(
    mList.getChildAt(mActivePosition),
    mActivePosition,
    mList.getAdapter().getItemId(mActivePosition));

where mActivePosition is the position of the child view in List View.

Upvotes: 1

ralphgabb
ralphgabb

Reputation: 10528

this may be old but this may help :

lvList.performItemClick(null, index, lvList.getItemIdAtPosition(index) ); 

NOTE : the first param is null and will still work, if you have a custom adapter, convertView will be filled with custom layout and view and such.

-cheers / happy codings.

Upvotes: 1

innershows
innershows

Reputation: 64

I just meet this freak problem today , and I try me best to deal with it. My condition is , when I first init the layout , I need make some item checked. But when I use gridView.getChildAt(position) , always return null. I met this problem before , caused by Not finishing drawing layout . So I send a post message . handler.postDelayed( .. , ..) , It works. Thanks who motion this Exception.

Upvotes: 0

dinhokz
dinhokz

Reputation: 937

If you are working on a unit test case. Try to use getInstrumentation().waitForIdleSync(), to wait the list be loaded, and extend the ActivityInstrumentationTestCase2 See this answer.

Upvotes: 0

Bunyod
Bunyod

Reputation: 1371

At Firstly I tried to use this code in my Fragment(Master/Detail -> NameListFragment)

getListView().performItemClick(null, 0, getListView().getAdapter().getItemId(0));

But it didn't work. When I did @Override onStart() method in fragment and I moved my code to onStart(). After that it works properly for me.

Upvotes: 0

denispyr
denispyr

Reputation: 1443

Using the code @sulal proposed, you may place it in onLoadFinished, if you use a LoaderManager. Eg something like

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    //....
    // mSelectedId keeps the currently selected id
    // INVID is an invalid value
    if (mSelectedId == INVID) { // nothing selected
        // sulal's code
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mList.performItemClick(
                        mList.getChildAt(mActivePosition),
                        mActivePosition,
                        mList.getAdapter().getItemId(mActivePosition));
                mSelectedId = mList.getAdapter().getItemId(mActivePosition);
            }
        });            
    }

mActivePosition may be 0 (ie position on the first item) or a position kept during eg onPause

Upvotes: 0

sulai
sulai

Reputation: 5354

This works best for me. Run this on the main thread.

new Handler().post(new Runnable() {
    @Override
    public void run() {
        mList.performItemClick(
                mList.getChildAt(mActivePosition),
                mActivePosition,
                mList.getAdapter().getItemId(mActivePosition));
    }
});

This is similar to Arun Jose's answer, but it will queue a message to the main thread to give the ListView some time to initiate.

Upvotes: 16

Arun Jose
Arun Jose

Reputation: 1857

mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

Where mActivePosition is your click position! All the best! :)

Upvotes: 66

AlikElzin-kilaka
AlikElzin-kilaka

Reputation: 36011

getListView().performItemClick(null, 0, 0) did the trick for me (for position 0).

Upvotes: -1

koljaTM
koljaTM

Reputation: 10262

I went with

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

Upvotes: 4

Steven
Steven

Reputation: 3240

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);

Upvotes: 29

Blehi
Blehi

Reputation: 2020

I tried the code below and it worked.

getListView().performItemClick(null, 0, getListAdapter().getItemId(0));

The first parameter (view) can be null.

Upvotes: 5

user1034443
user1034443

Reputation: 9

The performClick is probably called before listview was filled, put breakpoint in getView and on performItemClick and check wich is called first

Upvotes: -1

doppelhelix
doppelhelix

Reputation: 77

This is from Begining Android Games. It creates a simple list of items which you can click to open a new activity. Each list item of course, would have to also be added to the AndroidManifest.xml as a separate activity with a .ListItem# name.

public class MainActivity extends ListActivity {
String tests[] = { "ListItem1",
                   "ListItem2",
                   "ListItem3",
                   "ListItem4"};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tests));
}

@Override
protected void onListItemClick(ListView list, View view, int position, long id) {
    super.onListItemClick(list, view, position, id);
    String testName = tests[position];

    try {
        Class<?> classInstance = Class.forName("your.package.name." + testName);
        Intent intent = new Intent(this, classInstance);
        startActivity(intent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

}

Upvotes: -5

Related Questions