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