所以我有这么复杂的片段。它是ViewPager
中使用的片段,它由自己的CursorLoader
填充,还包含ListFragment
添加的一些getChildFragmentManager()
。
在onCreate()
我分配视图元素和initiat Loader就像这样
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.user_account, container, false);
mUserName = (TextView) v.findViewById(R.id.user_account_full_name);
mUserLastSeen = (TextView) v.findViewById(R.id.user_account_user_last_seen);
mCreditBalance = (TextView) v.findViewById(R.id.user_account_credit_balance);
...
// then I populate FrameLayouts with ListViewFragments
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.add(R.id.user_account_credit_history, CreditListFragment.newInstance(mUserId));
ft.add(R.id.user_account_bill_consumption, ConsumptionListFragmentAccount.newInstance(mUserId));
ft.commit();
// initiating the Loader
getActivity().getSupportLoaderManager().initLoader(0, null, this);
return v;
}
最后在onLoadFinished()
我希望填充我的观点
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.moveToFirst();
Log.e("TAG", data.getString(UserId.NAME));
mUserName.setText(data.getString(UserId.NAME));
mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
(data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
}
但未填充View
。 Log.e(...)
按预期编写用户名,因此启动Loader
广告包含有效数据,但我的TextView
都没有被数据替换,这非常非常奇怪。< / p>
有什么想法吗?
编辑 /知道了!
解决方案开始回答。非常感谢Shoeb Siddique,感谢您的帮助!你是明星!
答案 0 :(得分:2)
mUserName = (TextView) v.findViewById(R.id.user_account_full_name);
handler.post(new Runnable() {
public void run() {
mUserName.setText(data.getString(UserId.NAME));
mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
(data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
}
});
答案 1 :(得分:1)
您可以使用用户界面线程 runOnUiThread :
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.moveToFirst();
Log.e("TAG", data.getString(UserId.NAME));
getActivity().runOnUiThread(new Runnable() {
public void run() {
mUserName.setText(data.getString(UserId.NAME));
mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
(data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
}
});
Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
}
答案 2 :(得分:0)
由于ViewPager
有很多兄弟Fragment
,我在所有兄弟姐妹中都使用了相同的loaderId = 0
。
如果存在相同Context
,loaderId
和LoaderCallbacks
的加载程序,LoaderManager.initLoader()
将返回已创建的加载程序,因此我的所有碎片共享一个Loader
。
发起Fragment
冷杉的Loader
让我们称之为clickFragment
,而LoaderCallbacks
没有填充clickFragment
,所有碎片都是{{1} ,clickFragment
右侧/下方的所有片段都填充了clickFragment
的数据。因此clickFragment
启动了Loader
,并且ViewPager
准备了兄弟碎片,数据被传递到所有正确的碎片。奇怪的是,clickFragment
本身并没有填充,我没有将视图滑动到兄弟姐妹,所以我看到空View
并且感到困惑。
现在我为每个片段生成唯一的loaderId
,它最终有效。