私はアンドロイドアプリケーションのSmartTabLayout
ライブラリを介してタブ機能を実装しています。現在私はfragment
を私のtabs
の両方のためのviewpagerとして使っています。唯一の違いは、リスト項目の並べ替えということです。以下は私のHomeActivityコードです:異なるタブで使用されている同じフラグメント内のリストビューデータを更新できません
HomeActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
final SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
viewPagerTab.setCustomTabView(this);
FragmentPagerItems pages = new FragmentPagerItems(this);
pages.add(FragmentPagerItem.of("Test1", SampleFragment.class));
pages.add(FragmentPagerItem.of("Test2", SampleFragment.class));
FragmentStatePagerItemAdapter adapter = new FragmentStatePagerItemAdapter(
getSupportFragmentManager(), pages);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
viewPagerTab.setViewPager(viewPager);
}
@Override
public View createTabView(ViewGroup container, int position, PagerAdapter adapter) {
LayoutInflater inflater = LayoutInflater.from(container.getContext());
View tab = inflater.inflate(R.layout.custom_tab_icon_and_notification_mark, container, false);
TextView txtTab=(TextView)tab.findViewById(R.id.txtTitle);
switch (position){
case 0:txtTab.setText("Test1");break;
case 1:txtTab.setText("Test2");break;
default:throw new IllegalStateException("Invalid pos - "+ position);
}
return tab;
}
私SampleFragment.javaは、私は、データのためのいくつかのサーバ要求を行うとlistview
アダプタを更新ここ下記の通りです。
SampleFragment.java
List<Items> lstItems=new ArrayList<>();
static ItemListAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_sample, container, false);
ListView lstviewItems = (ListView) view.findViewById(R.id.lstItems);
int position = FragmentPagerItem.getPosition(getArguments());
View emptyView=view.findViewById(R.id.emptyList);
lstviewItems.setEmptyView(emptyView);
mAdapter = new ItemsListAdapter(getActivity(),lstItems);
lstviewItems.setAdapter(mAdapter);
switch (position){
case 0:
//JsonObjectRequest
loadItems();
break;
case 1:
//sort the loaded items
break;
}
return view;
}
private void loadItems(){
try {
JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET,url, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
lstItems.clear();
for (int i = 0; i < response.length(); i++) {
//Add item to lstItems
}
mAdapter.notifyDataSetChanged();
}
}
});
testApp.getInstance().addToRequestQueue(request);
} catch (Exception ex) {
ex.printStackTrace();
}
}
しかし、現在のviewPager tab
すなわちTest1
タブの後でさえもmAdapter.notifyDataSetChanged()
listview
は更新取得されていません。 Test2
タブに移動すると、データが正しく読み込まれているリストビューの変更が表示されます。以下は、2つの異なるタブのスクリーンショットです。
また、私はこの問題のために検索し、私のために動作しませんでした他の解決策を見つけました。溶液の存在のいずれか、以下のようにItemsAdapter
におけるリフレッシュ方法を追加:
public void refresh(List<Items> items)
{
this.items = items;
notifyDataSetChanged();
}
、代わりのmAdapter.notifyDataSetChanged()
IはmAdapter.refresh(lstItems);
を用います。しかし残念ながら、それはどちらもうまくいきませんでした。どうすればこれを克服できますか?これについてさらに詳しく説明しなければならないかどうか教えてください。
まあ、それは迅速でした。しかしこれは私の問題を解決しましたが、今は別の方法です。私は 'mAdapter'を非静的にし、' tab1'でデータを取得し始めましたが、 'tab2'では何も見つかりませんでした。あなたがこれについて提案できるものは何ですか? –
これはあなたのスイッチケースのためです。現在のフラグメントが位置0にある場合にのみ、データをロードします。更新されたポストをチェックしてください。 – beeb
ビットが混乱しているようです。デモとしてコードサンプルを追加すると便利です:) –