【问题标题】:Android Java Viewpager loads in the same viewPager view positionAndroid Java Viewpager 在相同的 viewPager 视图位置加载
【发布时间】:2017-06-05 13:56:22
【问题描述】:

我是 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 片段中更新列表视图的最后一部分(在 viewPager 中显示) 当我从活动中获取列表视图 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();
    }
}

【问题讨论】:

    标签: java android android-viewpager


    【解决方案1】:

    好的,你已经接近了,但还没有。

    在您的 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));
    

    希望这会有所帮助!

    【讨论】:

    • 感谢@user3308353,不幸的是这并没有改变。我可以看到选项卡很好地改变了位置索引,但视图仍然是在同一个页面视图中生成的。不能说我错在哪里
    • 好的,我刚刚看到你的更新,很高兴你把它修好了!我建议选择您的答案作为正确答案,让看到此问题的其他人知道它已被回答。 (绿色复选标记)
    • 我会的! 7小时内就能搞定
    【解决方案2】:

    终于找到问题了! 这是我在最后一部分调用 ContentRoster() Fragment 中的适配器时,它是 viewPager 的一部分!

    我正在使用: mListView = (ListView) getActivity().findViewById(R.id.listView);

    而不是: mListView = (ListView) getView().findViewById(R.id.listView);

    列表现在显示在正确的位置!

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多