ListView / GridView 不在 Fragment 中刷新
ListView / GridView not refreshing inside Fragment
片段的其他元素得到更新,只有 listview 和 gridview 没有。我可以在日志中看到适配器的内容正在发生变化,但视图仅在我单击它们或 onResume() 时刷新。
我已经在 UIThread 中尝试过 adapter.notifyDataSetChanged() 和 adapter.notifyDataSetInvalidated(),listview.invalidateViews() 和 gridview.invalidateViews() 以及 requestLayout()、requestFocus( ) 和 performClick(),因为当我触摸视图区域时它们会刷新。
我也试过detach/attach片段。
当我再次尝试 gridview.setAdapter 时,内容变为空白,并在我单击 gridview 区域时更新显示。
我正在使用 AndroidAnnotations。
@EActivity(R.layout.activity)
public class MyActivity extends AppCompatActivity {
@FragmentById
Fragment1 fragment1;
@FragmentById
Fragment2 fragment2;
void whenSomethingHappens() {
fragment1.onChange();
fragment2.onChange();
}
}
@EFragment(R.layout.fragment1)
public class Fragment1 extends Fragment {
@ViewById
GridView gridView;
@Bean
MyAdapter1 adapter1;
@AfterViews
void init() {
gridView.setAdapter(adapter1);
}
void onChange() {
adapter1.clear();
adapter1.addAll(elements); // The elements are changed, but not the gridview
}
}
@EFragment(R.layout.fragment2)
public class Fragment2 extends Fragment {
@ViewById
ListView listView;
@Bean
MyAdapter2 adapter2;
@AfterViews
void init() {
listView.setAdapter(adapter2);
}
void onChange() {
adapter2.clear();
adapter2.addAll(elements); // The elements are changed, but not the listView
}
}
@EBean
public class Adapter1 extends ArrayAdapter<Model1> {
@RootContext
Context context;
public Adapter1(Context context) {
super(context, R.layout.model1_item);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Model1Item model1Item;
if (convertView == null) {
model1Item = Model1Item_.build(context);
} else {
model1Item = (Model1Item) convertView;
}
Model1 model1 = getItem(position);
model1Item.bind(model1);
return model1Item;
}
}
Adapter2 与 Adapter1 相同,但型号和项目不同。这些项目是@ViewGroups,只是将模型绑定到视图元素。
编辑:现在,效果最好的是 requestFocusFromTouch(),但感觉有点问题。
发现我并没有在所有情况下都调用 onChange,而且它也没有按预期在 UIThread 上 运行。所以基本上代码更改是:
@UiThread
void onChange() {
adapter.clear();
adapter.addAll(elements);
}
片段的其他元素得到更新,只有 listview 和 gridview 没有。我可以在日志中看到适配器的内容正在发生变化,但视图仅在我单击它们或 onResume() 时刷新。
我已经在 UIThread 中尝试过 adapter.notifyDataSetChanged() 和 adapter.notifyDataSetInvalidated(),listview.invalidateViews() 和 gridview.invalidateViews() 以及 requestLayout()、requestFocus( ) 和 performClick(),因为当我触摸视图区域时它们会刷新。
我也试过detach/attach片段。
当我再次尝试 gridview.setAdapter 时,内容变为空白,并在我单击 gridview 区域时更新显示。
我正在使用 AndroidAnnotations。
@EActivity(R.layout.activity)
public class MyActivity extends AppCompatActivity {
@FragmentById
Fragment1 fragment1;
@FragmentById
Fragment2 fragment2;
void whenSomethingHappens() {
fragment1.onChange();
fragment2.onChange();
}
}
@EFragment(R.layout.fragment1)
public class Fragment1 extends Fragment {
@ViewById
GridView gridView;
@Bean
MyAdapter1 adapter1;
@AfterViews
void init() {
gridView.setAdapter(adapter1);
}
void onChange() {
adapter1.clear();
adapter1.addAll(elements); // The elements are changed, but not the gridview
}
}
@EFragment(R.layout.fragment2)
public class Fragment2 extends Fragment {
@ViewById
ListView listView;
@Bean
MyAdapter2 adapter2;
@AfterViews
void init() {
listView.setAdapter(adapter2);
}
void onChange() {
adapter2.clear();
adapter2.addAll(elements); // The elements are changed, but not the listView
}
}
@EBean
public class Adapter1 extends ArrayAdapter<Model1> {
@RootContext
Context context;
public Adapter1(Context context) {
super(context, R.layout.model1_item);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Model1Item model1Item;
if (convertView == null) {
model1Item = Model1Item_.build(context);
} else {
model1Item = (Model1Item) convertView;
}
Model1 model1 = getItem(position);
model1Item.bind(model1);
return model1Item;
}
}
Adapter2 与 Adapter1 相同,但型号和项目不同。这些项目是@ViewGroups,只是将模型绑定到视图元素。
编辑:现在,效果最好的是 requestFocusFromTouch(),但感觉有点问题。
发现我并没有在所有情况下都调用 onChange,而且它也没有按预期在 UIThread 上 运行。所以基本上代码更改是:
@UiThread
void onChange() {
adapter.clear();
adapter.addAll(elements);
}