Android 不同选项卡上具有ListView的相同片段

Android 不同选项卡上具有ListView的相同片段,android,fragment,android-tabbed-activity,tabbed-view,Android,Fragment,Android Tabbed Activity,Tabbed View,我想创建一个显示3个选项卡的活动。第一个选项卡应显示用户上传的照片,第二个选项卡显示用户喜欢的所有图像,第三个选项卡显示用户喜爱的图像。所有这些数据都来自一个Web服务。我想用同一个片段来处理它的布局文件,并调用不同的URL。该片段实现了一个StringReader并在其中填充一个listview。 我的问题是,我设法在第一个选项卡中加载了片段,但第二个和第三个选项卡仍然是空的。如果我导航到最后一个选项卡并开始向后导航,那么第一个选项卡将保持为空,第二个选项卡将被填充。我看了这么多的教程,尽了最


我想创建一个显示3个选项卡的活动。第一个选项卡应显示用户上传的照片,第二个选项卡显示用户喜欢的所有图像,第三个选项卡显示用户喜爱的图像。所有这些数据都来自一个Web服务。我想用同一个片段来处理它的布局文件,并调用不同的URL。该片段实现了一个StringReader并在其中填充一个listview。
我的问题是,我设法在第一个选项卡中加载了片段,但第二个和第三个选项卡仍然是空的。如果我导航到最后一个选项卡并开始向后导航,那么第一个选项卡将保持为空,第二个选项卡将被填充。我看了这么多的教程,尽了最大努力,但似乎没有任何帮助。
我的活动中的片段实例化如下所示:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    // getItem is called to instantiate the fragment for the given page.
    // Return a PlaceholderFragment (defined as a static inner class below).
    switch (position) {
        case 0:
            return UsersSpheresFragment.newInstance();
        case 1:
            return UsersSpheresFragment.newInstance();
        case 2:
            return UsersSpheresFragment.newInstance();
        default:
            return  null;
    }
}

@Override
public int getCount() {
    // Show 3 total pages.
    return 3;
}

@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return "SECTION 1";
        case 1:
            return "SECTION 2";
        case 2:
            return "SECTION 3";
    }
    return null;
}
}


我的片段是:

public class UsersSpheresFragment extends Fragment {

    CircleImageView userImageFragment;
    TextView userNameTextFragment;
    TextView nrOfSpheresFragment;
    LinearLayout loadingLayoutFragment;
    ListView listview_spheresFragment;
    public PhotosphereListAdapter adapter;
    TextView nrOfLikes;
    TextView nrOfSeens;

    String userId="";
    String userName = "";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.my_spheres_fragment,container,false);
        return view;
    }

    // newInstance constructor for creating fragment with arguments
    public static UsersSpheresFragment newInstance() {
        UsersSpheresFragment fragmentFirst = new UsersSpheresFragment();
        return fragmentFirst;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        userImageFragment = (CircleImageView) getActivity().findViewById(R.id.userImageFragment);
        userNameTextFragment = (TextView) getActivity().findViewById(R.id.userNameTextFragment);
        nrOfSpheresFragment = (TextView) getActivity().findViewById(R.id.nrOfSpheresFragment);
        loadingLayoutFragment = (LinearLayout) getActivity().findViewById(R.id.loadingLayoutFragment);
        listview_spheresFragment = (ListView) getActivity().findViewById(R.id.listview_spheresFragment);
        nrOfLikes = (TextView)getActivity().findViewById(R.id.nrOfLikes);
        nrOfSeens = (TextView)getActivity().findViewById(R.id.nrOfSeens);

        GlobalUserData userData = (GlobalUserData)getActivity().getApplication();
        Bundle bundle = this.getArguments();

        if (bundle != null) {
            userId = bundle.getString("userId","");
            userName = bundle.getString("userName","");
            userNameTextFragment.setText(userName);
        }
        else{
            if (userData.getUserImageLink().length() > 0) {
                LoadUserImage(userData.getName(), userData.getUserImageLink());
            }
            userNameTextFragment.setText(userData.getName());

        }
        //Log.i("TAG",userData.GetAllData());


        if (userId.length() > 0)
            loadImagesFromAPI(MainActivity.URL_DATA+"typ=mysphere&id="+userId);
        else
            loadImagesFromAPI(MainActivity.URL_DATA+"typ=mysphere&id="+userData.getUserId());

        listview_spheresFragment.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //send the photosphereId to the Panoviewer fragment
                Bundle bundle = new Bundle();
                bundle.putString("Id", view.getTag().toString());
                bundle.putString("Title", ((Photosphere) adapter.getItem(position)).getTitle());
                bundle.putString("Description", ((Photosphere) adapter.getItem(position)).getDescription());
                bundle.putString("ThumbUrl", ((Photosphere) adapter.getItem(position)).getImageUrl());
                bundle.putBoolean("ShowUserLink", userId.length() > 0 ? false : true);
                //create the fragment
                SimpleFragment fragment = new SimpleFragment();
                fragment.setArguments(bundle);
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content_main, fragment);
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                transaction.addToBackStack(null);
                transaction.commit();

            }
        });

    }

    public void LoadUserImage(String userName, String imageUrl){
        ImageLoader imageLoader = CustomVolleyRequest.getInstance(getActivity()).getImageLoader();
        Bitmap bm =  imageLoader.get(imageUrl, ImageLoader.getImageListener(userImageFragment, android.R.color.white, android.R.color.white)).getBitmap();
        userImageFragment.setImageBitmap(bm);
        userNameTextFragment.setText(userName);
    }

    public void loadImagesFromAPI(final String Url) {
        loadingLayoutFragment.setVisibility(View.VISIBLE);
        StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.GET, Url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            ArrayList<Photosphere> photospheres = new ArrayList<>();
                            JSONObject jsonObject = new JSONObject(response);
                            if(jsonObject.isNull("userModel") || jsonObject.getJSONObject("userModel").isNull("OtherImages")){
                                loadingLayoutFragment.setVisibility(View.GONE);
                                nrOfSpheresFragment.setText("No images");
                            }
                            else {
                                if (userId.length() >0){
                                    LoadUserImage((jsonObject.getJSONObject("userModel")).getString("UserName"),(jsonObject.getJSONObject("userModel")).getString("ImgPath"));
                                }
                                photospheres = new WebServiceReader().processSpheresModelJsonData(jsonObject.getJSONObject("userModel"),"OtherImages");
                                loadingLayoutFragment.setVisibility(View.GONE);
                                //init adapter
                                adapter = new PhotosphereListAdapter(getActivity(), photospheres, (userId.length() > 0 ? false : true),true);
                                listview_spheresFragment.setAdapter(adapter);
                                nrOfSpheresFragment.setText(nrOfSpheresFragment.getText()+"("+listview_spheresFragment.getCount()+")");
                                nrOfLikes.setText((jsonObject.getJSONObject("userModel")).getString("TotalLikes"));
                                nrOfSeens.setText((jsonObject.getJSONObject("userModel")).getString("TotalViews"));
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        nrOfSpheresFragment.setText("An error occurred. Please try again!");
                    }
                }
        );

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);
    }



    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

这行代码更新了textview,我可以看到textview被更新了3次(25)(10)(5),这意味着结果的数量。只有最后一个结果的listview可见

您可以将变量设置为fragment,它可以帮助您选择所需的内容

private String mUrl; //url of content 

//set url of content via newInstanse() method
public static UsersSpheresFragment newInstance(String dataUrl) {
    UsersSpheresFragment fragment = new UsersSpheresFragment();
    Bundle arguments = new Bundle();
    arguments.putInt(EXTRA_KEY_ULR, dataUrl);
    fragment.setArguments(arguments);
    return fragment;
}

//get url in onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle extras = getArguments();
    if (extras == null || !extras.containsKey(EXTRA_KEY_URL))
        throw new IllegalArgumentException("missing authorId argument");

    mUrl = extras.getInt(EXTRA_KEY_URL);

    //load your data 
    webService.loadData(mUrl);
}

另一个变体是通过
newIntanse(int-type)
方法设置内容类型,并在
fragment\onCreate()中选择数据匹配它的类型。
我发现了问题所在。
当我使用片段时,(片段是以前创建的,并以其他方式使用),我没有注意到在初始化页面中的控件时,我使用了
getactivity()
而不是
rootview
。因此,为了使它工作,我改变了这两个,如图所示

   userImageFragment = (CircleImageView) view.findViewById(R.id.userImageFragment);
    userNameTextFragment = (TextView) view.findViewById(R.id.userNameTextFragment);
    nrOfSpheresFragment = (TextView) view.findViewById(R.id.nrOfSpheresFragment);
    loadingLayoutFragment = (LinearLayout) view.findViewById(R.id.loadingLayoutFragment);
    listview_spheresFragment = (ListView) view.findViewById(R.id.listview_spheresFragment);
    nrOfLikes = (TextView)view.findViewById(R.id.nrOfLikes);
    nrOfSeens = (TextView)view.findViewById(R.id.nrOfSeens);

我知道,问题是片段只在第一个选项卡中加载,然后,我想,必须检查第二个片段上是否调用了
onViewCreated
,当第一条消息显示时,我在onViewCreated上记录了一条伪消息,在加载活动时只调用了2次,调用fragmentsTry来使用
FragmentStatePagerAdapter
,因为您的片段似乎正在失去状态!没有解决我的问题。顺便说一句,我复制了这个片段并添加了一个不同的url用于测试。第一个选项卡中似乎只加载了最高位置,因此在我的例子中,位置1中的片段加载到第一个选项卡中,而第二个选项卡仍然为空。关于
offScreenPageLimit(3)
?这没有帮助。只返回了2个结果。但是表2和表3仍然是空的
   userImageFragment = (CircleImageView) view.findViewById(R.id.userImageFragment);
    userNameTextFragment = (TextView) view.findViewById(R.id.userNameTextFragment);
    nrOfSpheresFragment = (TextView) view.findViewById(R.id.nrOfSpheresFragment);
    loadingLayoutFragment = (LinearLayout) view.findViewById(R.id.loadingLayoutFragment);
    listview_spheresFragment = (ListView) view.findViewById(R.id.listview_spheresFragment);
    nrOfLikes = (TextView)view.findViewById(R.id.nrOfLikes);
    nrOfSeens = (TextView)view.findViewById(R.id.nrOfSeens);