在单击任何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循环(初始化/条件)应该改变什么?
答案 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
方法将其通知适配器。您还可以维护视图的状态,无论它是否可以从数据库中看到。