当我尝试使用ListView的 performItemClick 功能时,我遇到了一些困难。
我想要做的就是在列表的第一项中以编程方式执行单击。
我该怎么做?我在文档中查找了该函数,但我并没有真正理解它的参数。
我尝试过类似的事情:
myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());
但它不起作用(myListView.getChildAt(0) returns null)
提前谢谢!
答案 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();
}
}
}