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