Android: как мне сделать один вызов модернизации, в котором он будет отображаться на разных вкладках, tablayout?

Я создаю приложение для Android, в котором я буду отображать фотографии в макете вкладок. Требование должно быть не более 20 фотографий в каждой вкладке. Как отобразить фотографии на вкладке? Я использую viewpager и свой текущий код. Кстати, это сайт, который я использовал для своих данных: https://jsonplaceholder.typicode.com/photos

Спасибо!

Адаптер:

public class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.MyViewHolder> {

private Context mContext;
List<Photos> photosList = new ArrayList<>();


public PhotoAdapter(Context mContext, List<Photos> photosList){
    this.photosList = photosList;
    this.mContext = mContext;
}


@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.photo_card, viewGroup, false);

    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
    Photos photos = photosList.get(i);
    Log.i("Position: ", i+1 + " Id: " + photos.getId());
    myViewHolder.mTitleTextView.setText(photos.getTitle());
    myViewHolder.mIdTextView.setText(photos.getId());
    String thumbnail = photos.getUrl();

    Glide.with(mContext)
            .load(thumbnail)
            .into(myViewHolder.mUrlImageView);

}

@Override
public int getItemCount() {
    //return photosList.size();
    return 20;
}

public class MyViewHolder extends RecyclerView.ViewHolder{

    public TextView mTitleTextView, mIdTextView;
    ImageView mUrlImageView;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);

        mTitleTextView = (TextView) itemView.findViewById(R.id.titleTextView);
        mIdTextView = (TextView) itemView.findViewById(R.id.idTextView);
        mUrlImageView = (ImageView) itemView.findViewById(R.id.photoImageView);

    }
}

Фрагмент: (Динамический)

public class DyanamicFragment extends Fragment {

private RecyclerView mRecyclerView;
public List<Photos> photos = new ArrayList<>();

public static DyanamicFragment newInstance(){
    return new DyanamicFragment();
}

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

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dynamic_fragment_layout, container, false);
    initViews(view);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.PhotosRecyclerView);
    mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),4));


    return view;
}

private void initViews(View view) {
    TextView textView = view.findViewById(R.id.commonTextView);
    textView.setText(String.valueOf("Category: " +getArguments().getInt("position")));

    loadJSON();
}

private void loadJSON(){
    Service serviceAPI = Client.getClient();
    Call<JsonArray> loadPhotosCall = serviceAPI.readPhotosArray();

    loadPhotosCall.enqueue(new Callback<JsonArray>() {
        @Override
        public void onResponse(Call<JsonArray> call, Response<JsonArray> response) {
            try {
                String photosString = response.body().toString();
                Type listType = new TypeToken<List<Photos>>() {}.getType();
                photos = getPhotosListFromJson(photosString, listType);

                mRecyclerView.setItemAnimator(new DefaultItemAnimator());
                mRecyclerView.setAdapter(new PhotoAdapter(getContext(), photos));
            }catch (Exception e){
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<JsonArray> call, Throwable t) {

        }
    });
}


public static <T> List<T> getPhotosListFromJson(String jsonString, Type type){
    if (!isValid(jsonString)){
        return null;
    }
    return new Gson().fromJson(jsonString, type);
}

public static boolean isValid(String json){
    try {
        new JsonParser().parse(json);
        return true;
    }catch (JsonSyntaxException jse){
        return false;
    }
}

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

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

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

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

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

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

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


}

Мероприятия:

public class MainActivity extends AppCompatActivity {

private ViewPager viewPager;
private TabLayout mTabLayout;

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

    initView();
}

private void initView() {

    viewPager = findViewById(R.id.viewpager);
    mTabLayout = findViewById(R.id.tabs);
    viewPager.setOffscreenPageLimit(5);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.setOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
    setDynamicFragmentToTabLayout();
}

private void setDynamicFragmentToTabLayout() {
    for (int i = 1; i < 6; i++) {
        if (i == 1){
            mTabLayout.addTab(mTabLayout.newTab().setText("Photos: 1-20"));
        }
        if (i == 2){
            mTabLayout.addTab(mTabLayout.newTab().setText("Photos: 21-40"));
        }
        if (i == 3){
            mTabLayout.addTab(mTabLayout.newTab().setText("Photos: 41-60"));
        }
        if (i == 4){
            mTabLayout.addTab(mTabLayout.newTab().setText("Photos: 61-80"));
        }
        if (i == 5){
            mTabLayout.addTab(mTabLayout.newTab().setText("Photos: 81-100"));
        }
    }
    DynamicFragmentAdapter mDynamicFragmentAdapter = new DynamicFragmentAdapter(getSupportFragmentManager(), mTabLayout.getTabCount());
    viewPager.setAdapter(mDynamicFragmentAdapter);
    viewPager.setCurrentItem(0);
}
}

@PateOrtega, не могли бы вы также добавить код ViewPager.

Mohit Ajwani 18.12.2018 05:59

@MohitAjwani уже добавил.

Pate Ortega 18.12.2018 06:05

Вы нигде не выбираете элементы, мудрые по страницам. Например, когда вы добавляете фрагмент adapter.addFragment(new PhotoTab2Fragment(), "21-40");, вы устанавливаете только заголовок вкладки. Вам нужно выполнить итерацию по страницам и добавить в список 20 элементов, которые необходимо отобразить. Добавление фрагмента должно происходить только при условии, если в списке есть элементы более одной страницы. Кроме того, вы не должны использовать цикл while в методе onBindViewHolder, он заблокирует ваш поток пользовательского интерфейса.

Mohit Ajwani 18.12.2018 08:21
0
3
531
1

Ответы 1

Вам необходимо выполнить вызов api во фрагменте или действии, в котором есть пейджер представления.

Затем вы можете проанализировать ответ и установить необходимые данные изображения для каждого фрагмента при добавлении его в пейджер просмотра. Затем фрагменты могут отображать данные, которые были установлены в его список.

Другие вопросы по теме