如何在ListView OnItemClickListener中获取除单击项之外的其他项的视图?

时间:2013-05-07 14:08:53

标签: android view android-listview nullpointerexception onitemclicklistener

在单击任何listview项目时,我在获取其他视图时遇到的问题比单击的项目视图更难。我需要隐藏每个列表项视图中的视图,而不是单击项目视图。

以下代码适用于较少的项目4或5,这些项目一次只能看到,但是如果我有多个项目占用,则会产生问题(因为关闭强制关闭 - 在初始化panel1时出现NullPointerException)超过屏幕尺寸。

 for(int count = 0; count<listAdapter.getCount(); count++)

    {

     if(arg2!=count) 

       {

     int visiblePosition = jobList.getFirstVisiblePosition();

     View v = jobList.getChildAt(count - visiblePosition);



            panel1 = (LinearLayout)v.findViewById(R.id.panel1);

    panel1.setVisibility(View.GONE);

        }
    }

我刚刚在上面的代码中替换了view的初始化

      View v = jobList.getChildAt(count - visiblePosition);

      View v = jobList.getChildAt(count);

但问题仍然存在,即我在视图上收到NPE,以防万一我的项目比目前可见的项目多。我想这是因为我的for循环中的错误条件 count&lt; listAdapter.getCount(),我想这必须改成其他东西,以摆脱这个麻烦。

请建议,for循环(初始化/条件)应该改变什么?

3 个答案:

答案 0 :(得分:0)

是的,您将获得NullPointerException,因为您正在尝试访问不存在的视图。

查看不存在?为什么?

为什么因为ListView因性能原因而回收视图。因此它将为列表中的可见项分配内存。   例如,如果你列出了100个项目并且你一次可以看到10个项目,那么listview将仅为10个视图分配内存,当它们可见时,即当你滚动listview来识别项目时,将分配剩余视图。

您需要做什么?

跟踪ArrayList中的每个项目及其可见性,然后将所选项目的可见性设置为VISIBLE并休息

抱歉,我无法为您编码,但我会为您提供替代的简单解决方案

试试这个简单的方法

示例:

在你的活动

中选择这样的视图
View v;

并在onCreate

中对其进行初始化
v=new View();

并在listview onItemClick

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
      v.setVisibility(View.GONE);
      v=view;
      view.setVisibility(View.VISIBLE);
    }
});

修改

在适配器中获取变量

 int visibility=View.VISIBLE;

并且

设置您的项目的可见性

 view.setVisibility(visibility);

然后在onItemClick做这样的

您可以使用适配器实例访问活动中的可见性字段

adapter.visibility=View.GONE;
adapter.notifyDataSetChanged();
view.setVisibility(View.VISIBLE); 

// onItemClick中的第二个参数

答案 1 :(得分:0)

您可以做的是获取所点击项目的位置。运行for循环,从0到getChildCount(),并将每个位置与单击的位置匹配。如果匹配则在else部分中不执行任何操作view.setVisibility(View.Invisible)。它会起作用我想,我希望你的问题得到解决.....

得到了解决方案 这是你的onItemCLickListener

 listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            clickArrayList.clear();
            Toast.makeText(
                    ViewActivity.this,
                    "First Name: "
                            + studentArrayList.get(
                                    (int) listView.getAdapter().getItemId(
                                            arg2)).getFirstName() + "\n"
                            + "Last Name: "
                            + studentArrayList.get(arg2).getLastName(),
                    Toast.LENGTH_LONG).show();
            for (int i = 0; i < listView.getAdapter().getCount(); i++) {
                if (arg2 == i) {

                } else {

                    clickArrayList.add(arg2);
                }

            }
            listView.setAdapter(new MyCustomAdapter(ViewActivity.this,
                    studentArrayList, clickArrayList));



        }
    });

并在自定义适配器的getview方法中,在返回转换视图之前执行此操作....

    for (int i = 0; i < clicked.size(); i++) {
        Log.d("tag", "Position.... " + clicked.get(i));
        if (!(clicked.get(i) == arg0)) {
            holder.FirstnameText.setVisibility(View.INVISIBLE);
            holder.lastNameText.setVisibility(View.INVISIBLE);
        } else {
            holder.FirstnameText.setVisibility(View.VISIBLE);
            holder.lastNameText.setVisibility(View.VISIBLE);
        }

    }

答案 2 :(得分:0)

当您在主活动中编写项目单击侦听器时,它会为您提供三个参数:

  • 父视图
  • 当前观点
  • 位置

在父视图中,您可以获取所有视图。您可以隐藏其他视图,并通过notifyDataSetChanged方法将其通知适配器。您还可以维护视图的状态,无论它是否可以从数据库中看到。