1

Şu anda karşı karşıya olduğum sorunlardan biri, kullanıcı zaman çizelgesine bir şey eklerse, Current Timetable ikinci sekmesinde recyclerview içinde yenilenmesi gerektiğidir. Ancak, hiçbir zaman güncellenmez ve kullanıcının ana menüye geri dönmesi, Timetables etkinliğine geri dönmesi ve daha sonra Current Timetable'u seçmesi gerekir. ViewPager ve adaptörüyle ilgili bir şey olduğuna inanıyorum. Nerede yanlış gittiğimi göremiyorum ve eminim ki eksik olan bir şey. Eğer buradaİlk sekmeden viewpager'daki ikinci sekmede recyclerview nasıl güncellenir?

çalışacak şekilde kodumu değiştirebilir Lütfen benim kodudur: viewpager sınıfı

public class Timetables extends AppCompatActivity{ 
    TabLayout tabLayout; 
    ViewPager viewPager; 
    Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.timetables); 
     viewPager = (ViewPager) findViewById(R.id.viewPager); 
     TimetablesAdapter timetablesAdapter = new TimetablesAdapter(getSupportFragmentManager(), Timetables.this); 
     viewPager.setAdapter(timetablesAdapter); 
     viewPager.setOffscreenPageLimit(2); 
     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       //viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       //viewPager.setCurrentItem(tab.getPosition()); 
      } 
     }); 
    } 
} 

fragmentpageradapter sınıfı:

public class TimestableAdapter extends FragmentPagerAdapter{ 

    String tabNames[] = new String[] {"All timetables", "Current Timetable", "Expired"}; 
    Context context; 

    public TimestableAdapter(FragmentManager fragmentManager, Context context){ 
     super(fragmentManager); 
     this.context = context; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position){ 
      case 0: 
       return new AllTimetables(); 
      case 1: 
       return new CurrentTimetables(); 
      case 2: 
       return new ExpiredTimetables(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return tabNames.length; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabNames[position]; 
    } 
} 

Bu CurrentTimetable sınıftır:

public class CurrentTimetables extends Fragment { 
    RecyclerView recyclerView; 
    static MusicRecyclerAdapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<Timetables> list; 

    public CurrentTimetables(){ 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.currenttimetable, container, false); 
     recyclerView = (RecyclerView) rootView.findViewById(R.id.timetablerecyclerView); 
     recyclerView.setHasFixedSize(true); 
     list = new ArrayList<Timetables>(); 
     adapter = new MusicRecyclerAdapter(list, CurrentTimetables.this); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setAdapter(adapter); 
     tabBackground = new TabBackground(CurrentTimetables.this, list, spinnerItems, adapter, spinnerAdapter); 
     tabBackground.populateConditionsList(); 
     inputs = new ArrayList<>(); 
     populate(); 
     return rootView; 
    } 

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

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

    } 

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

    public void populate(){ 
     String dbURL = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     RequestQueue requestQueue = Volley.newRequestQueue(fragment.getActivity()); 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest 
       (dbURL, new Response.Listener<JSONArray>(){ 

        @Override 
        public void onResponse(JSONArray jsonArray) { 
         if(!list.isEmpty()){ 
          list.clear(); 
         } 
         try { 
          for (int i = 0; i < jsonArray.length(); i++) { 
           JSONObject jsonObject = jsonArray.getJSONObject(i); 

           int timetableID = Integer.parseInt(jsonObject.getString("timetableID")); 
           String timetableName = jsonObject.getString("timetableName"); 
           String subjectName = jsonObject.getString("subjectName"); 

           Timetables timetables = new Timetables(timetableID, timetableName, subjectName); 
           list.add(timetables); 
           adapter.notifyDataSetChanged(); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener(){ 

        @Override 
        public void onErrorResponse(VolleyError volleyError) { 

        } 
       } 
       ); 
     requestQueue.add(jsonArrayRequest); 
    } 
} 

Gerçekten bir çok şey ifade eder misiniz eOne dışarı bana yardımcı olabilir

Teşekkür

+0

Zaman çizelgesi için veritabanınız varsa lütfen CurrentTimetables Fragman sınıfı –

+0

için kod gönderin, currentTimetable parçasının onResume yönteminde recyclerview'i yenilemeyi deneyin. – Shvet

+0

Tamam, diyelim ki, popülasyon yöntemini (bu, recyclerview öğesini db'deki değerlerle doldurur) onResume'de mi? –

cevap

3

Kodunuzda gerekli bazı değişiklikler var. Fragment'ın LifeCycle numarasını kontrol ederseniz, Tabular View ile nasıl çalıştığını anlayacaksınız.

Yukarıdaki kodu kullanarak yaptım.

public class CurrentTimetables extends Fragment { 
    RecyclerView recyclerView; 
    static MusicRecyclerAdapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<Timetables> list; 
    Context context; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     this.context = context; 
    } 

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

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     recyclerView = (RecyclerView) view.findViewById(R.id.timetablerecyclerView); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
     tabBackground = new TabBackground(CurrentTimetables.this, list, spinnerItems, adapter, spinnerAdapter); 
     tabBackground.populateConditionsList(); 
     // If you have another Component add here using finViewById() and also you can do 
     // other process here. I just used setUserVisibleHint because it will execute when 
     // fragment will be visible to user and it will stop over calling to web service. 
     /** 
     * Populate Recyclerview data if setUserVisibleHint do not work. 
     */ 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      populate(); 
     } 
    } 

    public void populate() { 
     String dbURL = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     RequestQueue requestQueue = Volley.newRequestQueue(context); 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(dbURL, new Response.Listener<JSONArray>() { 

      @Override 
      public void onResponse(JSONArray jsonArray) { 
       if (!list.isEmpty()) { 
        list.clear(); 
       } 
       try { 
        list = new ArrayList<Timetables>(); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 

         int timetableID = Integer.parseInt(jsonObject.getString("timetableID")); 
         String timetableName = jsonObject.getString("timetableName"); 
         String subjectName = jsonObject.getString("subjectName"); 

         Timetables timetables = new Timetables(timetableID, timetableName, subjectName); 
         list.add(timetables); 
         adapter = new MusicRecyclerAdapter(list, context); 
         recyclerView.setAdapter(adapter); 
         adapter.notifyDataSetChanged(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError volleyError) { 

      } 
     }); 
     jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(5 * 1000, 1, 1.0F)); 
     jsonArrayRequest.setShouldCache(false); 
     requestQueue.add(jsonArrayRequest); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     populate(); 
    } 
} 

Kodunuzdan bir şey unutmuş olabilirsiniz ve eklemeniz gerekebilir.

+1

ile ilgili bir şey olduğunu düşünüyorum Ne arkadaşı biliyorsun.Sana nasıl teşekkür edeceğimi bilmiyorum. İŞE YARIYOR!!! Bir sonraki sekme güncellemeleri ancak 2 saniye gecikmeli fakat hey, bu sunucuya bağlı - Sanırım bunu –

+0

düzeltebilirim Sadece ne ilgisi var jsonArrayRequest.setRetryPolicy (yeni DefaultRetryPolicy (5 * 1000, 1, 1.0F))); 've' jsonArrayRequest.setShouldCache (false); 'demek? Bunu hiç yapmadım ama ne anlama geliyor? –

+0

RetryPolicy web servis çağrısını tekrar ve tekrar yapmak için kullanılır, ilk parametre web servisine devam etmek için minTime, ikinci parametre ise başarısız olursa tekrar denemesi gereken süre ve üçüncü parametre geri dönüş çarpanıdır. – Shvet

İlgili konular