我有一个带有自定义适配器的ListView。 在适配器中,布局从xml中膨胀。
一切正常,我可以看到项目,直到屏幕方向改变。 我知道然后重新创建(或恢复)Activity,并且还重新创建了ListView,以及适配器。 但是现在ListView中没有任何项目。适配器不为空,我使用toasts来显示适配器中的项目数。
我想有一个膨胀的问题,因为如果我使用相同的适配器(或具有相同数据的适配器)到新的ListView也没有显示。 但是我不理解的最疯狂的事情是,如果我让我的getView()方法返回一个简单的TextView,即使在方向改变之后,一切正常。
我尝试了几件事,比如不回收View以使其每次都膨胀,或者将View保存到匹配的Item(来自Adapter的getItem(position))。
我很感激所有提示:)
编辑:所以我被要求提供一些代码。这是我的Adaptar的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;
}
答案 0 :(得分:0)
您正在丢失列表项,因为在更改方向时android的默认行为是销毁您的活动并重新创建它。选择此行为是为了使android能够使用可能特别用于新方向的新布局重新创建活动。
为防止列表项消失,有几件事需要完成。在方向改变期间有用的第一件事是在更改后简单地重复使用相同的活动。这可以通过在清单中添加以下行来完成:
android:configChanges="keyboardHidden|orientation"
它传递给你的onConfigurationChanged()方法,如果你不提供它,它除了重新测量布局之外什么都不做,这似乎是在大多数时间处理旋转的完全适当的方式
答案 1 :(得分:0)
我遇到了同样的问题,虽然不是因为方向改变而且我通过重新设置活动或者你拥有的任何情况后再次设置listView.setAdapter(adapter)
来找到解决方案。我怀疑listview基本上是丢失了指向适配器的指针。