2017-03-22 16 views
0


3 개의 탭을 보여주는 활동을 만들고 싶습니다. 첫 번째 탭에는 사용자가 업로드 한 사진이 2 번째로 표시되고 3 번째는 사용자가 좋아하는 이미지를 표시해야합니다. 이러한 모든 데이터는 웹 서비스에서 가져옵니다. 레이아웃 파일과 동일한 URL을 사용하고 다른 URL을 사용하고 싶습니다. 이 프래그먼트는 StringReader를 구현하고 내부에리스트 뷰를 채 웁니다.
제 문제는 첫 번째 탭에서 Fragment를로드 할 수 있지만 두 번째와 세 번째 탭은 비어있는 상태입니다. 마지막 탭으로 이동하여 다시 탐색하기 시작하면 첫 번째 탭은 비어 있고 두 번째 탭은 채워집니다. 나는 많은 수의 튜토리얼과 붉은 색을 보았지만 아무 것도 도움이되지 못했다.
는 내 활동의 조각 인스턴스화는 다음과 같습니다
다른 탭의 목록보기가있는 동일한 조각

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()+")"); 

코드 행 텍스트 뷰를 갱신하고, I (5) 결과의 수를 의미되는 텍스트 뷰가 3 회 (25) (10)이 업데이트되는 것을 볼 수있다. 마지막 결과의 목록보기가 표시되는

+0

시도로 두 변경! – Wizard

+0

내 문제가 해결되지 않았습니다. Btw, 나는이 조각을 복제하고 테스트 목적으로 다른 URL을 추가했습니다. 첫 번째 탭에는 가장 높은 위치 만로드 된 것 같습니다. 제 경우에는 위치 1의 프래그먼트가 첫 번째 탭에로드되고 두 번째 탭은 비어 있습니다. – Coder

+0

'offScreenPageLimit (3)'은 어떻습니까? – Wizard

답변

0

문제가 무엇인지 알아 냈습니다.
조각을 사용했을 때 (조각을 전에 만들어서 다른 방법으로 사용했을 때) 페이지의 컨트롤을 초기화 할 때 대신 getactivity()을 사용한다는 것을 알지 못했습니다. 그것의 당신의 조각 상태를 잃어버린 것 같다 그래서 그것이 작동되도록하기 위해서 나는`FragmentStatePagerAdapter`를 사용하는 것으로

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

당신은 조각에 변수를 설정할 수 있습니다, 마녀는 당신이 다른 변형이 newIntanse(int type) 방법을 통해 컨텐츠의 유형을 설정

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); 
} 

필요 내용을 선택하고 입력 데이터가 일치를 선택하는 데 도움이 fragment#onCreate()

+0

문제는 조각이 첫 번째 탭에만로드된다는 것입니다. – Coder

+0

첫 번째 쇼인 경우 두 번째 조각에서'onViewCreated'가 호출되는지 확인해야합니다. – Dmitriy

+0

onViewCreated에 더미 메시지를 기록했으며, 조각을 호출 한 활동이로드 될 때 2 회만 호출되었습니다 – Coder