【问题标题】:ListView / GridView not refreshing inside FragmentListView / GridView 在 Fragment 内不刷新
【发布时间】:2016-10-17 07:10:49
【问题描述】:

片段的其他元素得到更新,只有 listview 和 gridview 没有。我可以在日志中看到适配器的内容正在发生变化,但视图仅在我单击它们或 onResume() 时才会刷新。

我已经在 UIThread、listview.invalidateViews() 和 gridview.invalidateViews() 以及 requestLayout()、requestFocus() 和 performClick() 中尝试了 adapter.notifyDataSetChanged() 和 adapter.notifyDataSetInvalidated(),因为它们在刷新时我触摸视图区域。

我也尝试过分离/附加片段。

当我再次尝试 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(),但感觉有点问题。

【问题讨论】:

    标签: listview gridview android-annotations notifydatasetchanged android-view-invalidate


    【解决方案1】:

    弄清楚我并没有在所有情况下都调用 onChange,而且它也没有按预期在 UIThread 上运行。所以基本上代码更改是:

    @UiThread
    void onChange() {
        adapter.clear();
        adapter.addAll(elements);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多