ViewPager не обновляет фрагмент с обновленным содержимым

#android #android-fragments #android-viewpager

#Android #android-фрагменты #android-viewpager

Вопрос:

я страдаю 3 дня. Я использую View Pager из библиотеки совместимости. Я успешно получил его, отображая несколько представлений.Моя проблема в том, что когда я меняю вид, не обновляйте данные по фрагменту в его представлении recycler.Но когда я закрыл свое приложение, затем открытые фрагменты отображают обновленное содержимое с помощью recycler view. я использую все методы, такие как setnotifydatachanged () и многие другие, но фрагмент в viewpager не обновляет содержимое.Спасибо за любую помощь, это моя основная деятельность

  public class MainActivity extends AppCompatActivity {
 private ViewPager viewPager;
 private TabLayout tabLayout;
 @Override

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("");
    setSupportActionBar(toolbar);
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    viewPager.setAdapter(new              MainAdapter(getSupportFragmentManager(),MainActivity.this));
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    addIconsToTab();

}
       private void addIconsToTab() {
        for (int i = 0; i < tabLayout.getTabCount(); i  ) {
        int drwableId = -1;
        switch (i) {
            case 0:
                drwableId = R.drawable.home;
                break;
            case 1:
                drwableId = R.drawable.favourite;
                break;
            case 2:
                drwableId = R.drawable.watchlater;
                break;


        }
        tabLayout.getTabAt(i).setIcon(drwableId);
       }
    }
    }
   this is my main adapter 
   public class MainAdapter extends FragmentPagerAdapter {

  Context mContext;
   public MainAdapter(FragmentManager fm, Context context) {
    super(fm);
    mContext=context;
  }

  @Override
   public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new AllVideos();
        case 1:
            return new Favourite();
        case 2:
            return new WatchLater();

        default:
            return null;
     }
   }

@Override
 public int getCount() {
    return 3;
  }

  @Override
  public CharSequence getPageTitle(int position) {

    switch (position) {
        case 0:
            return mContext.getString(R.string.All_Videos);
        case 1:
            return mContext.getString(R.string.Favourite);
        case 2:
            return mContext.getString(R.string.Wtach_Later);
        default:
            return null;
    }
   }



   @Override
    public int getItemPosition(Object object) {

    return POSITION_NONE;
  }
 } 
 And this is my Fragment
 public class Favourite extends Fragment {



  private RecyclerView mRecyclerView;
  private FavouriteAdapter favouriteAdapter;



 RecyclerView.LayoutManager layoutManager;
 @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup        container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_recyclerview_carpaccio,     container, false);
  }

  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState)      {
    super.onViewCreated(view, savedInstanceState);
    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    layoutManager = new LinearLayoutManager(getActivity());
    DatabaseHandler db = new DatabaseHandler(getActivity());
    mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.setHasFixedSize(true);
    List<VideoInformationDataModel> videoinfo = db.getAllFavourite();
    favouriteAdapter = new FavouriteAdapter(getActivity(),videoinfo);
    mRecyclerView.setAdapter(favouriteAdapter);
    favouriteAdapter.notifyDataSetChanged();
              Toast.makeText(getActivity(),videoinfo.size() "",Toast.LENGTH_SHORT).show();


   }

  }

 And this is fragmentAdapter
  public class FavouriteAdapter extends        RecyclerView.Adapter<FavouriteAdapter.MyViewHolder>
{
     private int[] maid = {R.id.deleteoption};
    Context context;
    private List<VideoInformationDataModel> videoInformationDataModels;
   String videoid1;
    private FavouriteAdapter favouriteAdapter;
   public class MyViewHolder extends RecyclerView.ViewHolder implements           View.OnClickListener {
    public TextView title;
    View root;
    protected ImageLoader img_uni_imageLoader;
    DatabaseHandler db = new DatabaseHandler(context);
    ImageView networkImage,options;
    TextView Duration,Videoname;
    public MyViewHolder(View view) {
        super(view);
        root = itemView.findViewById(R.id.videoImage);
        Duration= (TextView) itemView.findViewById(R.id.duration);
        Videoname= (TextView) itemView.findViewById(R.id.VideoName);
        networkImage= (ImageView) itemView. findViewById(R.id.imgNetwork);
        options= (ImageView) itemView.findViewById(R.id.deleteoption);
        options.setOnClickListener(this);

      } 


    @Override
    public void onClick(View view) {
        if (maid[0] == view.getId()) {

            PopupMenu popup = new PopupMenu(context, options);
            popup.getMenuInflater().inflate(R.menu.deleteoption,           popup.getMenu());
            popup.setOnMenuItemClickListener(new          PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId())
                    {
                        case R.id.delete:

                            int pos = getAdapterPosition () ;

                            videoid1=            videoInformationDataModels.get(pos).getVideoid();

                            db.deleteFavourite(videoid1);

                            videoInformationDataModels.remove(pos);
                            notifyItemRemoved(pos);

                            notifyItemRangeChanged(pos, getItemCount());


                            return true;


                    }
                    return false;
                }
            });
            popup.show();
        }


       }
    }


  public FavouriteAdapter(Context context, List<VideoInformationDataModel>       videoinformation) {

      this.videoInformationDataModels = videoinformation;
      this.context=context;


  }

  @Override
  public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.favouritesingleitem, parent, false);

    return new MyViewHolder(itemView);
   }

  @Override
  public void onBindViewHolder(MyViewHolder holder, final int position) {

         holder.Duration.setText(videoInformationDataModels.get(position).getVideoduratio   n());
         holder.Videoname.setText(videoInformationDataModels.get(position).getVideoinfo()    );
    holder.img_uni_imageLoader = ImageLoader.getInstance();
             .img_uni_imageLoader.init(ImageLoaderConfiguration.createDefault(context));
         holder.img_uni_imageLoader.displayImage(videoInformationDataModels.get(position)   .getVideoimg(), holder.networkImage);
    holder.root.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context, YouTube.class);
            Bundle extras = new Bundle();

            String Videtittle =     videoInformationDataModels.get(position).getVideoinfo();
            String videodes =      videoInformationDataModels.get(position).getFld_description();

            String duration =   videoInformationDataModels.get(position).getVideoduration();
            String videoid =    videoInformationDataModels.get(position).getVideoid();
              extras.putString("Videtittle", Videtittle);
            extras.putString("videodes", videodes);
            extras.putString("duration", duration);
            extras.putString("videoid", videoid);
            intent.putExtras(extras);
            context.startActivity(intent);

             }
          });

        }





  @Override
 public int getItemViewType(int position)
 {
    return position;
 }




 public int getItemCount() {
    return videoInformationDataModels.size();
 }
 }
  

Ответ №1:

Я не очень уверен, с какой проблемой вы столкнулись, но можете ли вы попробовать один раз, заменив FragmentPagerAdapter на FragmentStatePagerAdapter (расширение с помощью mainAdapter).

Комментарии:

1. проблема в том, что, моя дорогая, у меня есть 3 фрагмента, например, A, B и C, когда приложение открывается в первый раз, тогда все фрагменты содержат обновленные данные. но после того, как я добавил видео во фрагмент B, он не обновляет свой список видео. если я закрою свое приложение и снова открою, фрагмент B обновит свой список видео

Ответ №2:

Я не совсем понимаю, в чем именно заключается ваша проблема, это может быть результатом неправильной реализации. Но если вы пробовали favouriteAdapter.notifyDataSetChanged(); , и он все еще не обновляется.

Вы также можете удалить представление, обновить его и добавить представление обратно и посмотреть, работает ли это.

            ViewGroup parent = (ViewGroup) viewPager.getParent(); // get the view parent
            if (parent != null) {
                parent.removeView(viewPager); // remove the view
                viewPager.getAdapter().notifyDataSetChanged(); // notify that the data has changed
                parent.addView(viewPager); // then, re-add the view
            }
  

Комментарии:

1. проблема в том, что, моя дорогая, у меня есть 3 фрагмента, например, A, B и C, когда приложение открывается в первый раз, тогда все фрагменты содержат обновленные данные. но после того, как я добавил видео во фрагмент B, он не обновляет свой список видео. если я закрою свое приложение и снова открою, фрагмент B обновит свой список видео

2. Да, вот почему я сказал, что вы должны создать метод и поместить в него мой ответ, вызовите этот метод после добавления видео, чтобы ваш просмотр был удален и добавлен повторно.

3. Когда вы обновляете данные, проверяете ли вы размер данных, чтобы узнать, действительно ли они были обновлены?