Android – ListView – performItemClick

当我尝试使用ListView的performItemClick函数时,我遇到了一些困难。

我想要做的就是在列表的第一项中以编程方式执行点击操作。

我怎样才能做到这一点? 我在文档中查找了这个函数,但是我并没有真正理解它的参数。

我尝试了这样的:

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

但它没有工作(myListView.getChildAt(0) returns null)

先谢谢你!

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

在哪里mActivePosition是您的点击位置! 祝一切顺利! 🙂

这对我有效。

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

使用适配器来获取该项目的位置的视图。 其他2个参数我不想要,所以我把它们留空。 将convertView留空将导致适配器呈现新视图。 这是一个性能问题,但由于这只是偶尔发生,它不会有太大的影响。 我不需要指定任何东西的父母,因为我没有使用它。

位置就是您的物品所在的位置。 另外,这两行代码在performItemClick之前创build了select列表项的错觉。 他们还确保在屏幕上显示相应的项目。

 listView.requestFocusFromTouch(); listView.setSelection(position); 

这对我最好。 在主线程上运行这个。

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

这与阿伦·何塞的答案类似,但它会将消息排队到主线程,让ListView有一段时间启动。

我去了

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

我试了下面的代码,它的工作。

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

第一个参数(视图)可以为null。

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

其中mActivePosition是列表视图mActivePosition视图的位置。

使用代码@sulalbuild议,如果你使用LoaderManager,你可以把它放在onLoadFinished中。 比如像

 @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可以是0(即在第一个项目上的位置)或在例如onPause期间保持的位置

首先,我试图在我的片段(主/细节 – > NameListFragment)中使用此代码

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

但它没有工作。 当我做@Override onStart()方法的片段,我把我的代码移动到onStart() 。 之后,它适合我的工作。

我正在与performItemClick工作,它为我工作,但有一点问题。 我尝试着按压项目的背景,但它从来没有工作,只是注意到,如果您将转换视图为空(第二个参数),然后尝试对OnClick()做一些事情,它不会因为getView()方法适配器给你一个不同的视图对象。 你需要操纵你的适配器的getView()方法来捕捉视图,这样你就可以在它上面了。

如果你正在做一个unit testing用例。 尝试使用getInstrumentation()。waitForIdleSync()等待列表被加载,并扩展ActivityInstrumentationTestCase2请参阅此答案 。

我今天刚遇到这个怪胎问题,我尽我所能来处理它。 我的情况是,当我第一次初始化布局时,我需要检查一些项目。 但是,当我使用gridView.getChildAt(位置),总是返回null。 之前我遇到过这个问题,由于没有完成图纸的布局。 所以我发了一条信息。 handler.postDelayed(..,..),它的工作原理。 谢谢谁提出这个exception。

这可能是旧的,但这可能有所帮助:

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

注意:第一个参数是空的,仍然可以工作,如果你有一个自定义的适配器,convertView将被填充自定义布局和视图等。

– 开瓶器/快乐编码。

这对我的工作如果你会得到奇怪的结果,当使用getView,这是因为你想要的列表项不存在可见部分。 使用如下:

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

接着,

 listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0); 

当使用ListView(简单的数组适配器或自定义适配器)定义listview和其他最后使执行点击。

例如:

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

注意:创buildsetOnItemClickListener之后,只能调用执行单击。 否则,它将不正确。

试试这个:

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

performClick可能在listview被填充之前调用,把断点放在getView和performItemClick并检查是否被调用的第一个

getListView().performItemClick(null, 0, 0)为我做了诀窍(位置0 )。

丢掉一些经验

使用listview1.performItemClick,也会触发你的listview1.OnItemClickListener,如果你在你的代码中使用同一个列表视图。

 Hope It helps 

如果使用getView时候会得到奇怪的结果,这是因为你想要的列表项不存在于可见部分。 使用如下:

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

接着,

 listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0); 

这适用于我:

 listview.getSelectedView().performClick(); 

这对我工作:

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

这是从开始Android游戏。 它创build一个简单的项目列表,您可以点击打开一个新的活动。 当然,每个列表项也必须作为单独的活动添加到AndroidManifest.xml文件中。

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

}