我在 ViewPager 中有一个带有自定义布局的 ListFragment。这个 ListFragment 和自定义布局执行一个 ListView 和一个调用 AsyncTask 的 Button。
工作完成后,此 AsyncTask 调用 onPostExecute 刷新方法(在 ListFragment 中创建)以更新适配器(代码如下)。当我按下此按钮时,一切正常,直到发生方向变化。
然后,如果我按下按钮,列表会更新,但不会添加或删除任何行。因此,即如果我只有一行并且在更新适配器后是空的,则不会对 List 进行任何更改。另一方面,如果应将某些行添加到列表中,我们只会注意到现有行已更改其内容。
如果在此“失败”更新之后发生方向更改,则列表显示正常。所以我们可以说这个列表只在方向改变之后才能很好地更新适配器的内容。
对主要活动的引用总是传递给 ListFragment 并且适配器被正确更新(我检查了它的日志)。
有人有什么想法吗?我会非常感激。
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="10">
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="9" />
<Button android:id="@+id/Refresh"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:text="Update" />
</LinearLayout>
和代码:
public class ResFragment extends ListFragment {
View view = null;
public static AdapterRes adapter;
public static ArrayList<NodeP> mItems = new ArrayList<NodeP>();
public static MyAppActivity ref ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new AdapterRes(ref, ref.result);
adapter.notifyDataSetChanged();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.result,null);
this.setListAdapter(adapter);
Button refresh = (Button) view.findViewById(R.id.Refresh);
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ref.initDownloadTask();
}
});
return view;
}
public void refresh(){
mItems.clear();
adapter = new AdapterRes(ref, ref.result);
this.setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
class AdapterRes extends ArrayAdapter<NodeP> {
Activity context = ref;
AdapterRes(Activity context, List<NodeP> objects) {
super(context, R.layout.row_res, objects);
this.context = ref;
}
@Override
public View getView( final int position, View convertView, ViewGroup parent)
{
View item = convertView;
final ViewHolder holder;
if(item == null)
{
LayoutInflater inflater = context.getLayoutInflater();
item = inflater.inflate(R.layout.row_res, null);
holder = new ViewHolder();
holder.local = (TextView)item.findViewById(R.id.local);
holder.resPartido = (TextView)item.findViewById(R.id.res);
holder.foreign = (TextView)item.findViewById(R.id.foreign);
item.setTag(holder);
}
else
{
holder = (ViewHolder)item.getTag();
}
holder.local.setText(ref.result.get(position).local);
holder.res.setText(ref.result.get(position).res);
holder.foreign.setText(ref.result.get(position).foreign);
return(item);
}
public class ViewHolder {
public TextView local;
public TextView res;
public TextView foreign;
}
}
}