Android 如何在ListView Listener中获取除单击项以外的其他项的视图?

Android 如何在ListView Listener中获取除单击项以外的其他项的视图?,android,view,android-listview,nullpointerexception,onitemclicklistener,Android,View,Android Listview,Nullpointerexception,Onitemclicklistener,在单击任何listview项目时,我在获取除单击的项目视图之外的其他视图时遇到了问题。我需要从每个列表项视图中隐藏一个视图,而不是单击的项视图 下面的代码可以很好地处理较少的项目4或5,这些项目一次可以看到,但是如果我有多个项目,占用的屏幕大小超过了屏幕大小,就会产生问题(在panel1初始化时强制关闭-NullPointerException导致崩溃) for(int count = 0; count<listAdapter.getCount(); count++) {

在单击任何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);

        }
    }

但问题仍然是一样的,即,我在视图上接收到NPE,以防万一,我的项目确实比当前可见的项目多。我想这是因为for循环count中的错误条件,我想必须将其更改为其他内容才能摆脱此问题


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

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

视图不存在?为什么?

原因是ListView出于性能原因而回收视图。因此,它将为列表中的可见项分配内存。 i、 例如,如果列表中有100个项目,并且一次可以看到10个项目,则listview将仅为10个视图分配内存,剩余视图在可见时(即滚动listview以标识项目时)将分配内存

你需要做什么?

跟踪每个项目及其在ArrayList中的可见性,然后将选定项目的可见性设置为VISIBLE,将rest设置为gone

很抱歉,我无法为您编码,但我将为您提供另一种简单的解决方案

试试这个简单的方法

例如:

在你的活动中采取这样的观点

View v;
并在
onCreate

v=new View();
在您的列表视图中,单击

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

将中项目的可见性设置为

 view.setVisibility(visibility);
然后在
菜单中单击

 int visibility=View.VISIBLE;
您可以使用适配器实例访问活动中的可见性字段,以便

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

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

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);
    }
});
找到解决办法了吗 这是你的听众

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



        }
    });
listView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
单击ArrayList.clear();
Toast.makeText(
这个,,
“名字:”
+studentArrayList.get(
(int)listView.getAdapter().getItemId(
arg2)).getFirstName()+“\n”
+“姓氏:”
+studentArrayList.get(arg2.getLastName(),
Toast.LENGTH_LONG).show();
对于(int i=0;i
在自定义适配器的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);
        }

    }
for(int i=0;i
在主活动中编写项目click listener时,它会提供三个参数:

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

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

您可以发布适配器类吗?请详细说明执行此操作的方法吗?我的要求是隐藏列表项中存在的视图,因此,我需要隐藏与列表项位置对应的每个视图。如何做到这一点?我还尝试使用listAdapter.notifyDataSetChanged()和listView.invalidate()在使所需(单击的)视图可见之前刷新onItemClick中的列表,但它们都没有按照我的要求工作。@NarendradroidForm您的要求是什么?你试过我上面贴的东西吗?您期望的输出是什么?上面的解决方案应该是可行的,因为我已经发布了,在使用tryNo之后,我还没有尝试过,我只是和你的编辑一起发表了评论。我的要求只是在执行可见性操作之前刷新列表。请让我知道,如何获取其他部分中的视图?我在if部分(位置匹配的位置)中没有问题,只有其他部分非常困扰我,因为我无法获取项目的相应视图,未单击的。我认为您正在ListItem.setOnItemClickListener中执行此操作?如果是,那么您有一个属性作为view,因此在else部分中,将该视图设置为view.setvisibility(view.Invisible)就是这样。但是,该视图将是我真正不感兴趣的单击项目视图。我只是对其他观点感兴趣,即
    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);
        }

    }