Java 更改方向后,即使适配器包含项,ListView也为空/不显示
我得到了一个带有自定义适配器的ListView。 在适配器中,从xml扩展布局 一切都很好,我可以看到项目,直到屏幕方向改变。 我知道活动会被重新创建(或恢复),ListView和适配器也会被重新创建。 但是现在ListView中没有任何项。适配器不是空的,我使用toasts来显示适配器中的项目数 我想这是一个膨胀的问题,因为如果我对一个新的ListView使用相同的适配器(或具有相同数据的适配器),那么也不会显示任何内容。 但我不明白的最疯狂的事情是,如果我让getView()方法返回一个简单的TextView,即使在方向改变之后,一切都可以正常工作 我尝试了几种方法,比如不要循环使用视图,使其每次都膨胀,或者将视图保存到匹配的项目(从适配器的getItem(position))中 我非常感谢所有提示:) 编辑:所以有人问我一些代码 这是我的Adapter的getView()Java 更改方向后,即使适配器包含项,ListView也为空/不显示,java,android,xml,Java,Android,Xml,我得到了一个带有自定义适配器的ListView。 在适配器中,从xml扩展布局 一切都很好,我可以看到项目,直到屏幕方向改变。 我知道活动会被重新创建(或恢复),ListView和适配器也会被重新创建。 但是现在ListView中没有任何项。适配器不是空的,我使用toasts来显示适配器中的项目数 我想这是一个膨胀的问题,因为如果我对一个新的ListView使用相同的适配器(或具有相同数据的适配器),那么也不会显示任何内容。 但我不明白的最疯狂的事情是,如果我让getView()方法返回一个简单
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View view = convertView;
final Event event = getItem(position);
if (view == null) {
view = inflater.inflate(R.layout.new_event_item_layout, parent,
false);
view.setTag(R.id.eventDate, view.findViewById(R.id.eventDate));
view.setTag(R.id.eventTime, view.findViewById(R.id.eventTime));
view.setTag(R.id.eventName, view.findViewById(R.id.eventName));
view.setTag(R.id.eventBemerkungen,
view.findViewById(R.id.eventBemerkungen));
view.setTag(R.id.eventIcon, view.findViewById(R.id.eventIcon));
}
((TextView) view.getTag(R.id.eventDate)).setText(event.getDate());
((TextView) view.getTag(R.id.eventTime)).setText(event.getName());
((TextView) view.getTag(R.id.eventName)).setText(event.getTime());
((TextView) view.getTag(R.id.eventBemerkungen)).setText(event
.getDescription());
SquaredImageView icon = (SquaredImageView) view.getTag(R.id.eventIcon);
Picasso.with(context).load(event.getUri())
.placeholder(R.drawable.ic_reload).into(icon);
view.setBackgroundColor(event.getBackgroundColor());
view.setVisibility(View.VISIBLE);
return view;
//return getDummyTextView();
}
public TextView getDummyTextView()
{
TextView tv=new TextView(context);
tv.setText("YOLO BIATCHSES");
tv.setTextColor(Color.WHITE);
return tv;
}
您正在丢失列表项,因为android在方向更改期间的默认行为是销毁您的活动并重新创建它。选择此行为是为了使android能够使用新布局重新创建活动,该布局可能特别用于新方向 为了防止列表项消失,必须做几件事。在方向更改期间,第一件有帮助的事情是在更改后简单地重用相同的活动。这可以通过在清单中添加此行来完成:
android:configChanges="keyboardHidden|orientation"
它将传递给onConfigurationChanged()方法,如果不提供它,它只会重新测量布局,在大多数情况下,这似乎是处理旋转的一种非常合适的方法。我也遇到了同样的问题,尽管这不是因为方向改变,我只是在重新创建活动或任何情况后再次设置
listView.setAdapter(adapter)
,找到了解决方法。我怀疑listview基本上丢失了指向适配器的指针。发布代码和日志这不起作用。但是我不确定你是否读过我的帖子:我说我知道它已经被重新创建了。这不是问题,因为所有的东西都被重新创建了,所以我的适配器包含了项目,而包含ListView的活动布局也再次膨胀,但由于一些未知的原因,它是不可见的。所以我做了一些研究,现在我使用的是android:configChanges=“orientation | screenSize | keyboardHidden”它可以工作,所以我会接受你的答案,但最终我不明白为什么这会工作。。。