2017-03-22 72 views
0


我想創建一個顯示3個選項卡的活動。第一個標籤應顯示用戶上傳的照片,即第二張用戶喜歡的所有圖像,以及第三張用戶最喜歡的圖像。所有這些數據都來自webservice.I想使用與它的佈局文件相同的片段並調用不同的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(); 
    } 
} 


更新! 似乎所有的片段都在第一個選項卡中加載和覆蓋。

nrOfSpheresFragment.setText(nrOfSpheresFragment.getText()+"("+listview_spheresFragment.getCount()+")"); 

這行代碼更新一個TextView和我可以看到的TextView被更新3次(25)(10)(5),這意味着結果的數量。只有最後結果的列表視圖可見

+0

嘗試使用'FragmentStatePagerAdapter'作爲其看來你的片段失去狀態! – Wizard

+0

沒有解決我的問題。順便說一句,我複製這個片段,並添加了一個不同的網址用於測試目的。似乎只有最高的位置被加載到第一個選項卡中,所以在我的情況下,來自位置1的片段被加載到第一個選項卡中,而第二個片段仍然是空的 – Coder

+0

'offScreenPageLimit(3)'? – Wizard

回答

0

我想清楚是什麼問題。
當我使用片段時(片段是之前創建的,以其他方式使用的)我沒有注意到當我初始化頁面中的控件時,我使用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); 
0

您可以設置變量片段,巫婆幫助您選擇內容,您需要

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()

+0

我知道,問題是片段只在第一個選項卡中加載 – Coder

+0

好吧,那麼,我認爲,必須檢查是否在第二個片段上調用了「onViewCreated」,當第一個片段顯示 – Dmitriy

+0

我在onViewCreated上記錄了一條虛擬消息,當活動加載時,它只被調用2次,其中稱爲碎片 – Coder

相關問題