Java Android ListView:空时不显示TextView
我有一个ListView,它显示用户从活动中动态生成的数组。基本上,该程序是一个计时器,用户可以选择一个时间,他们希望一个警报响起,还提供了一个描述,他们应该做什么时,警报响起 我使用SimpleAdapter设置ListView,它调用alarm_list_item.xml,其中包含两个TextView和一个图标,我希望为列表中的每个项目显示该图标Java Android ListView:空时不显示TextView,java,android,listview,textview,Java,Android,Listview,Textview,我有一个ListView,它显示用户从活动中动态生成的数组。基本上,该程序是一个计时器,用户可以选择一个时间,他们希望一个警报响起,还提供了一个描述,他们应该做什么时,警报响起 我使用SimpleAdapter设置ListView,它调用alarm_list_item.xml,其中包含两个TextView和一个图标,我希望为列表中的每个项目显示该图标 adapter = new AlarmListAdapter(this, stringArray, R.layout.alarm_list_ite
adapter = new AlarmListAdapter(this, stringArray, R.layout.alarm_list_item, new String[] {"name", "alert"}, new int[] {R.id.ListViewItem, R.id.ListViewItemSub});
当用户选择不为报警添加自定义对话框时,我希望将alarm_list_item.xml中文本视图的可见性设置为GONE,这样它就不会在列表中显示为空白。当我试图在活动中设置此参数时,我会得到一个NullPointerException,因为我假设xml文件实际上不是一个对象,但或多或少只是用作ListView的引用。有没有办法做到这一点
到目前为止,我通过将文本设置为“No Custom Notification Set”来解决这个问题,但我希望有一个更干净的选项,在不使用该行时将其全部删除
报警\u列表\u item.xml
<?xml version="1.0" encoding="utf-8"?>
您将需要超越适配器或方法:在那里,您可以设置所需视图的可见性。是一个格式不好(但技术上正确)的示例 编辑:尝试以下操作:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View v = super.getView(position, convertView, parent);
if(list.get(position).get("alert") == ""){
v.findViewById(R.id.ListViewItem).setVisibility(View.GONE);
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return convertView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.alarm_list_item, null);
}
if(list.get(position).get("alert") == ""){
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return convertView;
}
试着这样做:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View v = super.getView(position, convertView, parent);
if(list.get(position).get("alert") == ""){
v.findViewById(R.id.ListViewItem).setVisibility(View.GONE);
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return convertView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.alarm_list_item, null);
}
if(list.get(position).get("alert") == ""){
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return convertView;
}
我明白了
SimpleAdapter getView覆盖代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.alarm_list_item, null);
}
if(list.get(position).get("alert") == null){
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return super.getView(position, convertView, parent);
}
问题在于返回语句。我需要返回超级值。那么在adapater中重写getView之后,我是否应该使用for循环来迭代填充ListView的ArrayList并检查该值是否为null?如果为空,是否需要充气视图以编辑可见性设置?适配器扩展了SimpleAdapter,因此我似乎无法使用findViewById引用TextView。
getView
将为适配器中的每个项调用一次。对于每个调用,都会向您传递当前视图和位置:如果传递的视图为空,则从XML中膨胀视图,然后根据需要调整可见性。我更新了我的问题以包含适配器代码。每次尝试运行此操作时,我都会收到一个nullpointerexception。getView是否实际运行了传递到适配器的数组中的每个项?如果继续出现异常,请修改您的问题以包含logcat输出:使您更容易明确地找出问题所在。使用此代码获得相同的logcat错误。错误是围绕着能够获得视图,但是我不明白为什么它不能看到视图。我在adapter类中运行它,而不是在与适配器关联的活动中运行它。这是一个问题吗?嗯,我现在真的不知道是什么导致了它。由于单元格的重用,您需要放置一个else
子句,让它再次可见。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.alarm_list_item, null);
}
if(list.get(position).get("alert") == ""){
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return convertView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.alarm_list_item, null);
}
if(list.get(position).get("alert") == null){
v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE);
}
return super.getView(position, convertView, parent);
}