【问题标题】:How to set few fragments that have same structure in viewpager?如何在viewpager中设置几个具有相同结构的片段?
【发布时间】:2020-04-15 09:02:24
【问题描述】:

我是学习Android基础课程的初学者 我想通过使用单个片段制作 6 个具有相同结构的片段(只有标题、图像、文本会不同)。 我试过这段代码,但我只能看到一个片段。

MainActivity.java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = (ViewPager) findViewById(R.id.fragment_container);

    MoviePagerAdapter adapter = new MoviePagerAdapter(getSupportFragmentManager());

    mainfragment = new MainFragment();
    adapter.addItem(mainfragment);


    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(6);
}

ViewPager 适配器(在 MainActivity 中)

class MoviePagerAdapter extends FragmentStatePagerAdapter {

    public ArrayList<Fragment> items = new ArrayList<Fragment>();


    @Override
    public Fragment getItem(int position) {
        return items.get(position);
    }
    public MoviePagerAdapter(@NonNull FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }
    public void addItem(Fragment item) {
        items.add(item);
    }
    @Override
    public int getCount() {
        return items.size();
    }
}

MainFragment.java

public class MainFragment extends androidx.fragment.app.Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.main_frargment, container,
            false);

   //...

    'i want to make 6fragments with datas below '
    movieData = new MovieData("title1", "rate1", "grade1");
    addData(movieData);
    movieData = new MovieData("title2", "rate2", "grade2");
    addData(movieData);
    movieData = new MovieData("title3", "rate3", "grade3");
    addData(movieData);
    movieData = new MovieData("title4", "rate4", "grade4");
    addData(movieData);
    movieData = new MovieData("title5", "rate5", "grade5");
    addData(movieData);
    movieData = new MovieData("title6", "rate6", "grade6");
    addData(movieData);

    return rootView;
}
public void addData(MovieData movieData){
    Bundle bundle = new Bundle();
    bundle.putParcelable("data", movieData);
    MainFragment mainFragment = new MainFragment();
    mainFragment.setArguments(bundle);
    title.setText(movieData.title);
    reservation_rate.setText(movieData.getReservation_rate());
    grade.setText(movieData.getGrade());
    image.setImageResource(R.drawable.image6);
}

}

【问题讨论】:

    标签: android android-fragments android-viewpager bundle parcelable


    【解决方案1】:

    像这样更改您的代码:

     public class MainActivity extends AppCompatActivity {
    
     private MoviePagerAdapter adapter;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
    
     viewPager = (ViewPager) findViewById(R.id.fragment_container);
    
     adapter = new MoviePagerAdapter(getSupportFragmentManager());
     viewPager.setAdapter(adapter);
     viewPager.setOffscreenPageLimit(6);
    
    
     for(int i =0;i<6;i++){
            createFrag(i);
        }
     }
    }
    
    private void createFrag(int number) {
        MainFragment fragment = new MainFragment();
        Bundle args = new Bundle();
        args.putInt("NUMBER",number);
        fragment.setArguments(args);
        adapter.addItem(fragment);
        adapter.notifyDataSetChanged();
    }
    
    
    class MoviePagerAdapter extends FragmentStatePagerAdapter {
    
     public ArrayList<Fragment> items = new ArrayList<Fragment>();
    
    
     @Override
     public Fragment getItem(int position) {
       return items.get(position);
     }
     public MoviePagerAdapter(@NonNull FragmentManager fm) {
       super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
     }
     public void addItem(Fragment item) {
       items.add(item);
    }
     @Override
    public int getCount() {
      return items.size();
    }
    

    }

    并像这样更改您的片段:

         public class MainFragment extends androidx.fragment.app.Fragment {
         //1st
        private int number;
    
    
    
        @Nullable
    
    
       //this is variant 1 - with static Movie data
    
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
      ViewGroup container, @Nullable Bundle savedInstanceState) {
    
      ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.main_frargment, 
      container,
        false);
    
       //...
    
      //2d
       assert getArguments() != null;
      number = getArguments().getInt("NUMBER");
    
    
    
      switch (number) {
            case 0:
                MmovieData movieData1 = new MovieData("title1", "rate1", 
         "grade1");
                addData(movieData1);
                break;
            case 1:
                MmovieData movieData2 = new MovieData("title2", "rate2", 
          "grade2");
                addData(movieData2);
                break;
            //...
    
        }
    
        return rootView;
    }
    
    
    
      public void addData(MovieData movieData){
    
    
       title.setText(movieData.title);
       reservation_rate.setText(movieData.getReservation_rate());
       grade.setText(movieData.getGrade());
       image.setImageResource(R.drawable.image6);
    
      }
    
      }
    

    这是变体 2(带有动态数据和监听器)

         public class MainFragment extends androidx.fragment.app.Fragment {
         //1st
        private int number;
    
    
    
        @Nullable
    
    
    
    
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
      ViewGroup container, @Nullable Bundle savedInstanceState) {
    
      ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.main_frargment, 
      container,
        false);
    
       //...
    
      //2d
       assert getArguments() != null;
      number = getArguments().getInt("NUMBER");
    
        return rootView;
    }
    
    
      //some method of listener changed
      public void dataChanged(MovieData movieData, int position){
    
      if(number==position){
    
       title.setText(movieData.title);
       reservation_rate.setText(movieData.getReservation_rate());
       grade.setText(movieData.getGrade());
       image.setImageResource(R.drawable.image6);
    
      }
    
      }
    

    【讨论】:

    • 非常感谢 droidbaza!但是..我想模块化那个片段。因为我想稍后从服务器获取数据(标题,reservation_rate,等级,图像)我很抱歉再次询问,但是有没有任何方法可以模块化该片段或..数据?
    • 也就是说,您希望您的数据在特定片段中更新?您有数据更改监听器吗?
    • 嗯...是的!就像...如果标题更改,特定片段的标题也会更改。我没有数据更改监听器
    • 如果数据将来自服务器,建议设置一个监听器,在更改数据时,将在特定位置更新片段(变体 2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多