-1

在单击任何列表视图项目时,我在获取单击项目视图之外的其他视图时遇到了麻烦。我需要从每个列表项视图中隐藏一个视图,而不是单击的项目视图。

下面的代码适用于较少的项目 4 或 5,一次可见,但如果我有多个项目,它们占用的空间超过屏幕,则会产生问题(强制关闭时崩溃 - 面板 1 初始化时出现 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 v = jobList.getChildAt(count - visiblePosition);

      View v = jobList.getChildAt(count);

但是,问题仍然存在,即我在视图上收到 NPE,以防万一,我确实有比当前可见的项目更多的项目。我想这是因为我的 for 循环 计数 < listAdapter.getCount()中的错误条件,我想这必须更改为其他内容,才能摆脱这个麻烦。

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

4

3 回答 3

0

您可以做的是获取单击项目的位置。运行从 0 到 getChildCount() 的 for 循环,并将每个位置与单击的位置匹配。如果匹配,则在 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);
        }

    }
于 2013-05-08T09:00:24.933 回答
0

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

视图不存在?为什么?

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

你需要做什么?

跟踪每个项目及其在 ArrayList 中的可见性,然后将所选项目的可见性设置为 VISIBLE,其余设置为消失

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

试试这个简单的方法

例子:

在您的活动中查看这样的视图

View v;

并将其初始化为onCreate

v=new View();

并在您的列表视图中 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 实例访问 Activity 中的可见性字段,以便

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

// onItemClick 中的第二个参数

于 2013-05-07T14:39:59.740 回答
0

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

  • 父视图
  • 目前看来
  • 位置

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

于 2013-05-08T13:46:28.843 回答