当前位置: 首页 > 知识库问答 >
问题:

ViewPager不使用更新的内容更新片段

利稳
2023-03-14

我痛苦了3天。我正在使用兼容性库中的视图分页程序。我已经成功地让它显示了几个视图。我的问题是,当我交换视图时,不会在它的回收器视图中按片段更新数据。但当我关闭应用程序时,打开碎片会按回收器视图显示更新内容。我使用了所有方法,如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个答案

钱跃
2023-03-14

我不太确定您面临的是什么问题,但您是否可以尝试一次,将FragmentPagerAdapter替换为FragmentStatePagerAdapter(由MainAdapter扩展)。

 类似资料:
  • 下面是: 这是我要用于向中添加项的方法

  • 我正在考虑一个简单的例子,包括以下部分: Main活动:有编辑文本、按钮、viewPager 碎片A:什么都没有 碎片B:有文本视图 所以,在屏幕上,你可以滑动查看每个片段。我希望我的例子有这样一个功能:如果一个人在editText中写了一个文本,然后点击按钮,它就会出现在片段B中。 A使用notifyDatsetChanged()尝试了它,但不起作用。有人能帮忙吗?下面是我的全部代码: 主要活动

  • 我尝试使用onTabSelected来检测某个片段何时被选中,然后在接口的帮助下从该片段启动一个方法(下面的代码)。 但是,当使用Start方法时,在尝试更新TextView时会激发NullPointerException。start方法的代码是: 在以下行抛出异常: 是的,我已经在网上查过了所有可用的东西,但似乎没有任何东西对我有用。 非常感谢您的帮助!

  • 我一直在努力让我的JFrame重新绘制它的内容。在将新组件添加到JFrame中后,我尝试同时使用revaluate()和repaint()方法,但没有看到框架发生变化。 当用户单击前3个按钮中的任一个时,他们将进入以下代码块 当点击一个按钮时,整个应用程序变成白色,但我看不到我添加的新按钮。当我删除两个setVisible()方法行时,单击一个按钮肯定会删除组件,因为我现在不能单击其中任何一个,但

  • 我有一个显示列表的导航抽屉和一个显示内容的视页。当单击导航抽屉上列表中的特定项目时,将为所有页面生成一个URL,该URL将导致视图分页程序内容的更改。导航抽屉和查看页处于相同的活动中。view pager中的片段具有从服务器检索内容的URL。我怎样才能找到它? 下面是一些代码: 查看页有三页。适配器如下: 这些页面都有一个URL字段,用于从包含数据的服务器中提取json。所以简而言之,问题是当导航

  • 问题内容: 我的JTable有问题。我的JTable显示数据库的内容。一个数据库表具有名称类别。每个类别都显示在JComboBox中。如果单击类别,则应该更新表内容。 这是我的代码的简短摘要,因此可以更轻松地为我提供帮助。该代码应可运行: (TestClass-主要) (如果需要,则为TestTableModel-AbstractTableModel(您需要它来执行代码!) 使用此短代码,如果更改