【问题标题】:Android - ListView - performItemClickAndroid - ListView - performItemClick
【发布时间】:2011-12-27 00:19:35
【问题描述】:

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

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

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

我尝试了类似的方法:

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

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

提前谢谢你!

【问题讨论】:

  • 你解决了这个问题吗?如果是,请写答案。因为我遇到了同样的问题。提前谢谢。
  • 在 myListView.setAdapter(adapter) 之后使用延迟使用 myListView.performItemClick();

标签: android listview click


【解决方案1】:
mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

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

【讨论】:

  • 当使用mList.getChildAt(mActivePosition) 作为第一个参数时,我得到了最好的结果。
  • 我想把这段代码放在哪里?在 setOnItemClickListener 中?
  • @sulai,我觉得应该是mList.getChildAt(mList.getHeaderViewsCount()+mActivePosition)
  • 这应该在setOnItemClickListener(...)(如果有的话)之后..普通的东西,但我成功错过了。
  • 如果 chocieMode 是 singleChoice,这不会设置项目高亮
【解决方案2】:

这对我有用。

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

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

position 就是您的物品所在的位置。 此外,您 performItemClick 之前的这两行代码会产生选择列表项的错觉。他们还确保适当的项目出现在屏幕上。

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

【讨论】:

  • performItemClick 中的最后一个参数不应该是 listView.getAdapter().getItemId(position) 吗?
【解决方案3】:

这对我最有效。在主线程上运行它。

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

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

【讨论】:

  • 我将在另一个答案中使用您的答案,因为 cmets 不会格式化代码:/。感谢处理程序
  • 我不知道为什么,但是方向改变后这个方法不起作用
  • @JongzPuangput 一个可能的原因:您的 ListView 已重新创建,您需要在方向更改后为其获取新的参考:mList = getView().findViewById(R.id.list);
  • 它对我来说很糟糕..我确实使用了 BaseAdapter..Thankx
  • 这并不总是有效,因为 ViewGroup#getChildAt(int index) 仅适用于屏幕上当前可见的项目,请改用 getView(position, null, null)!
【解决方案4】:

我尝试了下面的代码,它成功了。

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

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

【讨论】:

  • 当@Arun Jose 的代码工作正常时,将第一个参数设置为 null,如此处所提议的,会导致应用程序崩溃
  • 好问题。对我来说,它工作正常。请检查 LogCat。也许你会找到原因。
  • 这也适用于我。我还发现id似乎被忽略了。
【解决方案5】:

我去了

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

【讨论】:

    【解决方案6】:

    使用 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 之后,您才应该调用 执行点击。否则,它不会正确。

    【讨论】:

      【解决方案7】:

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

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

      注意:第一个参数为 null 并且仍然可以工作,如果您有自定义适配器,convertView 将填充自定义布局和视图等。

      -欢呼/快乐的编码。

      【讨论】:

        【解决方案8】:
        mList.performItemClick(
            mList.getChildAt(mActivePosition),
            mActivePosition,
            mList.getAdapter().getItemId(mActivePosition));
        

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

        【讨论】:

          【解决方案9】:

          使用 @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 期间保持的位置

          【讨论】:

            【解决方案10】:

            起初我尝试在我的 Fragment(Master/Detail -> NameListFragment) 中使用此代码

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

            但它没有用。当我在片段中执行@Override onStart() 方法时,我将代码移至onStart()。之后它就可以正常工作了。

            【讨论】:

              【解决方案11】:

              如果您正在处理单元测试用例。 尝试使用 getInstrumentation().waitForIdleSync(),等待列表加载,并扩展 ActivityInstrumentationTestCase2 看到这个answer

              【讨论】:

                【解决方案12】:

                我今天才遇到这个怪问题,我尽力解决它。 我的条件是,当我第一次初始化布局时,我需要检查一些项目。 但是当我使用 gridView.getChildAt(position) 时,总是返回 null。我以前遇到过这个问题,是由于没有完成绘图布局引起的。所以我发了一个帖子。 handler.postDelayed( .. , ..) ,它有效。感谢提出此异常的人。

                【讨论】:

                  【解决方案13】:

                  这对我有用 如果您在使用 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);
                  

                  【讨论】:

                    【解决方案14】:

                    试试这个:

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

                    【讨论】:

                      【解决方案15】:

                      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】:

                        应该使用performItemClick() 就可以了。

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

                        【讨论】:

                          【解决方案17】:

                          在我的例子中,没有一个选项可以解决我的问题,所以我在我的 CursorAdapter 类中进行了调整。 我在作用域中定义了一个全局变量,所以我只是调用更改此值的类并通过传递位置值来检查光标位置

                           mProductsAdapter.currentPosition = requiredPosition
                          

                          在我的 ProductsAdapter 构建器中

                            var currentPosition = 0
                          

                          在 bindView 我做检查

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

                          【讨论】:

                            【解决方案18】:

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

                            【讨论】:

                            • 正在填充。至少它不是空的。即使在设置了适配器之后,我也尝试过放置那段代码,但它仍然不起作用。这真让我抓狂!有什么想法吗?
                            【解决方案19】:

                            getListView().performItemClick(null, 0, 0) 为我解决了问题(对于位置0)。

                            【讨论】:

                              【解决方案20】:

                              放弃一些经验

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

                              Hope It helps  
                              

                              【讨论】:

                                【解决方案21】:

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

                                【讨论】:

                                • 这是对@Arun Jose 回答的补充回答
                                【解决方案22】:

                                这对我有用:

                                listview.getSelectedView().performClick();
                                

                                【讨论】:

                                  【解决方案23】:

                                  这对我有用:

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

                                  【讨论】:

                                    【解决方案24】:

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

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

                                    }

                                    【讨论】:

                                    • 感谢您的回复,但这不是我想要的。我想使用 performItemClick 方法在我的 ListView 中以编程方式执行单击。
                                    • 请删除此答案,不正确!谢谢。
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2016-03-13
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多