Android - ListView - performItemClick

42 android listview click

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

我想要做的就是在列表的第一项中以编程方式执行单击.

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

我尝试过类似的东西:

 myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());
Run Code Online (Sandbox Code Playgroud)

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

先感谢您!

Aru*_*ose 63

mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));
Run Code Online (Sandbox Code Playgroud)

mActivePosition是您的点击位置!祝一切顺利!:)

  • 当使用`mList.getChildAt(mActivePosition)`作为第一个参数时,我得到了最好的结果. (13认同)

Ste*_*ven 27

这对我有用.

listView.performItemClick(
    listView.getAdapter().getView(position, null, null), position, position);
Run Code Online (Sandbox Code Playgroud)

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

位置只是您的项目所在的位置.另外,在performItemClick之前的这两行代码会产生选择列表项的错觉.他们还确保屏幕上显示相应的项目.

listView.requestFocusFromTouch();
listView.setSelection(position);
Run Code Online (Sandbox Code Playgroud)

  • performItemClick中的最后一个参数不应该是listView.getAdapter().getItemId(position)? (2认同)

sul*_*lai 14

这对我来说效果最好.在主线程上运行它.

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

这类似于Arun Jose的回答,但它会将消息排队到主线程以给出ListView一些时间来启动.

  • 这并不总是有效,因为ViewGroup#getChildAt(int index)只能对屏幕上当前可见的项目起作用,而是使用getView(position,null,null)! (2认同)

Ble*_*ehi 5

我尝试了下面的代码,它的工作原理.

getListView().performItemClick(null, 0, getListAdapter().getItemId(0));
Run Code Online (Sandbox Code Playgroud)

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


小智 -5

这是来自《开始 Android 游戏》。它创建一个简单的项目列表,您可以单击该列表来打开新活动。当然,每个列表项还必须作为具有 .ListItem# 名称的单独活动添加到 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

}