Android - ListView - performItemClick

时间:2011-11-11 12:54:16

标签: android listview click

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

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

我该怎么做?我在文档中查找了该函数,但我并没有真正理解它的参数。

我尝试过类似的事情:

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

但它不起作用(myListView.getChildAt(0) returns null)

提前谢谢!

25 个答案:

答案 0 :(得分:63)

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

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

答案 1 :(得分:26)

这对我有用。

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

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

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

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

答案 2 :(得分:14)

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

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

这与Arun Jose的答案类似,但它会将消息排入主线程,以便ListView有一段时间来启动。

答案 3 :(得分:6)

我尝试了下面的代码并且有效。

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

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

答案 4 :(得分:5)

我去了

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

我正在使用performItemClick,它对我有用,但有一点问题。 我试图为按下的项目的背景上色,但它从未起作用, 请注意,如果您将转换视图传递为null(第二个参数),然后尝试在OnClick()上执行某些操作,则无法生效,因为适配器的getView()方法会为您提供不同的View对象。 你需要操纵你的适配器的getView()方法来捕获视图,这样你就可以对它进行调整。

答案 7 :(得分:1)

使用Listview(简单数组适配器或自定义适配器)时,定义listview和其他最终make执行单击。

例如:

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

注意:只有在创建setOnItemClickListener后才应该调用 执行点击。否则,它将无法正确。

答案 8 :(得分:1)

这项工作对我来说 如果在使用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);

答案 9 :(得分:1)

试试这个:

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

答案 10 :(得分:1)

这可能有点旧,但这可能会有所帮助:

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

注意:第一个参数是null并且仍然有效,如果你有一个自定义适配器,convertView将填充自定义布局和视图等。

-cheers / happy codings。

答案 11 :(得分:1)

我今天刚遇到这个怪胎问题,我尽我所能来处理它。  我的条件是,当我第一次初始化布局时,我需要检查一些项目。     但是当我使用gridView.getChildAt(position)时,总是返回null。之前我遇到过这个问题,由未完成绘图布局引起。所以我发了一条帖子。 handler.postDelayed(..,..),它的工作原理。谢谢你动员这个例外。

答案 12 :(得分:1)

如果您正在处理单元测试用例。 尝试使用getInstrumentation()。waitForIdleSync(),等待加载列表,并扩展ActivityInstrumentationTestCase2 请参阅此answer

答案 13 :(得分:1)

首先,我尝试在我的片段中使用此代码(Master / Detail - &gt; NameListFragment)

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

但它不起作用。当我在片段中执行@Override onStart()方法时,我将代码移至onStart()。之后它适合我。

答案 14 :(得分:1)

使用建议的@sulal代码,如果使用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期间保持的位置

答案 15 :(得分:0)

myListView.getChildAt(0)返回null,因为很快就使用了它。

为此延迟。

或使用以下代码:

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

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

答案 16 :(得分:0)

这对我有用:

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

答案 17 :(得分:0)

这对我有用:

listview.getSelectedView().performClick();

答案 18 :(得分:0)

只应使用performItemClick(),就可以了。

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

答案 19 :(得分:0)

就我而言,没有一个选项可以解决我的问题,因此我在CursorAdapter类中进行了修改。 我在范围内定义了一个全局变量,所以我只需要调用更改此值的类并通过传递位置值来检查光标位置

 mProductsAdapter.currentPosition = requiredPosition

在我的ProductsAdapter构建器中

  var currentPosition = 0

在bindView中,我进行检查

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

答案 20 :(得分:0)

如果在使用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);

答案 21 :(得分:0)

放弃一些经验

使用listview1.performItemClick,如果您在代码中使用具有相同列表视图的侦听器,也会触发listview1.OnItemClickListener。

Hope It helps  

答案 22 :(得分:0)

getListView().performItemClick(null, 0, 0)为我做了伎俩(对于职位0)。

答案 23 :(得分:0)

可能在listview填充之前调用performClick,在getView和performItemClick上放置断点并检查首先调用

答案 24 :(得分:-4)

这是来自Begining Android Games。它会创建一个简单的项目列表,您可以单击该列表来打开新活动。当然,每个列表项也必须作为带有.ListItem#name的单独活动添加到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();
    }
}

}