[英]Android Java Viewpager loads in the same viewPager view position
我是Java / Android编程的新手。
我有一个带有tabLayout和viewPager的片段。 该片段从服务器获取了groupId / groupName的列表,然后需要为每个groupId创建一个页面。 它将值发送到适配器(在viewpager页面中显示的片段始终是ContentRoster(),但groupId定义了要显示的数据)
我的问题是,此ContentRoster()片段仅加载到viewpager的位置0中。 我可以按期望的方式滑动和滑动选项卡,但是所有负载都在同一视图中...
如果我有两组groupId,则第一个将在位置0加载,然后第二个groupId#2(将自动加载以填充下一个视图)更新位置0视图并擦除groupID#1视图。
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
super.onPostExecute(result);
TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.tabLayout);
final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.viewPager);
tabLayout.setupWithViewPager(viewPager);
AdapterViewPager mCustomPagerAdapter = new AdapterViewPager(getChildFragmentManager());
//add Fragment with specific arguments
for(int i = 0; i < result.size() ; i++) {
mCustomPagerAdapter.addFragment(new ContentRoster(), (result.get(i)).get("groupname"), (result.get(i)).get("groupid") );
}
//Set adapter if not null
if (viewPager != null) {
viewPager.setAdapter(mCustomPagerAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
}
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (viewPager != null) {
Log.i("#TAB_POS", "" + tab.getPosition());
viewPager.setCurrentItem(tab.getPosition());
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
if (viewPager != null) {
Log.i("#TAB_POS", "" + tab.getPosition());
viewPager.setCurrentItem(tab.getPosition());
}
}
});
}
适配器如下所示:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class AdapterViewPager extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
private final List<String> mFragmentParamsList = new ArrayList<>();
public void addFragment(Fragment fragment, String title, String params) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
mFragmentParamsList.add(params);
}
public AdapterViewPager(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
String groupId = mFragmentParamsList.get(position);
Fragment fragment = ContentRoster.newInstance(groupId);
return fragment;
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
ContentRoster()片段是这样的:我从包中检索groupId,并且'LoadRosterList()。execute(groupId)'对数据进行充电,并仅显示与所选选项卡一致的groupId数据。
public static ContentRoster newInstance(String groupId) {
ContentRoster ContentRoster = new ContentRoster();
Bundle args = new Bundle();
args.putString("groupId", groupId);
ContentRoster.setArguments(args);
return ContentRoster;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.content_listview, container, false);
Bundle args = getArguments();
groupId = args.getString("groupId");
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
new LoadRosterList().execute(groupId);
return view;
}
更新:这可以链接到我更新ContentRoster片段中的listview的最后一部分(在viewPager中显示),当我从活动中获取listview ID时?
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
super.onPostExecute(result);
try {
// Getting adapter by passing xml data ArrayList
ListView mListView;
mListView = (ListView) getActivity().findViewById(R.id.listView);
AdapterRoster adapter = new AdapterRoster(getActivity().getApplicationContext(), result);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
progressBar.setVisibility(View.GONE); //Effacage du Progress Bar
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
// Send intent to SingleViewActivity
Intent i = new Intent(getActivity().getApplicationContext(), ActivitySingleGuardian.class);
// Pass image index
i.putExtra("psnid", ((TextView) v.findViewById(R.id.psnid)).getText().toString());
i.putExtra("rank", ((TextView) v.findViewById(R.id.rank)).getText().toString());
i.putExtra("lastplay", ((TextView) v.findViewById(R.id.lastplay)).getText().toString());
i.putExtra("bungiename", ((TextView) v.findViewById(R.id.bungiename)).getText().toString());
i.putExtra("bungieid", ((TextView) v.findViewById(R.id.bungieid)).getText().toString());
i.putExtra("picpath", ((TextView) v.findViewById(R.id.picpath)).getText().toString());
i.putExtra("membershipType", ((TextView) v.findViewById(R.id.membershipType)).getText().toString());
startActivity(i);
}
});
} catch (NullPointerException e) {
e.printStackTrace();
}
}
好了,您已经接近了,但还没到那儿。
在您的onPostExecute方法中,考虑将最后一行从以下位置更改:
viewPager.setAdapter(mCustomPagerAdapter);
像这样:
if (viewPager != null) {
viewPager.setAdapter(mCustomPagerAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
}
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (viewPager != null) {
viewPager.setCurrentItem(tab.getPosition());
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
if (viewPager != null) {
viewPager.setCurrentItem(tab.getPosition());
}
}
});
这也会导致删除此行(更像是移动并添加到该行):
tabLayout.addOnTabSelectedListener(onTabSelectedListener(viewPager));
希望这可以帮助!
终于找到了问题! 这是我的最后一部分,当我在作为viewPager一部分的ContentRoster()片段内调用适配器时!
我正在使用:mListView =(ListView)getActivity()。findViewById(R.id.listView);
而不是:mListView =(ListView)getView()。findViewById(R.id.listView);
现在,该列表显示在正确的位置!
谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.