Search code examples
javaandroidandroid-fragmentsandroid-recyclerviewandroid-viewpager

How to solve issue of Viewpager in a fragment?


This is the Image of my app enter image description here

I am stuck at loading fragment at correct tab position. Whenever i am running my app,the fragment in my first tab is displayed in all tabs of viewpager and also the first tab file is displayed again over the fragment.

This is my MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getSupportFragmentManager().beginTransaction().
    replace(R.id.maincontainer,new DocumentsFragment()).commit();

    mviewPagerAdapter=new ViewPagerAdapter(getSupportFragmentManager());
    mViewPager=findViewById(R.id.viewpager);
    TabLayout tabLayout=findViewById(R.id.tabMode);
    tabLayout.setupWithViewPager(mViewPager);

   

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
       
        setviewPager(mViewPager);
    } else {
        requestStoragePermission();

    }

}

int Request_Code = 12;
private void setviewPager(ViewPager viewPagerAdapter)
{
    ViewPagerAdapter viewAdapter=new ViewPagerAdapter(getSupportFragmentManager());

viewAdapter.addFragment(new DocumentsFragment(),"Documents");
viewAdapter.addFragment(new FavouritesFragment(),"History");
viewAdapter.addFragment(new HistoryFragment(),"Favourites");
viewPagerAdapter.setAdapter(viewAdapter);
viewAdapter.notifyDataSetChanged();
}

private String[] permissionres = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

@RequiresApi(api = Build.VERSION_CODES.M)
private void requestStoragePermission() {

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Request_Code);

}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == Request_Code) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
           
            setviewPager(mViewPager);
          
        }
    } else {

    }
}

This is my recyclerAdapter Code

  package com.example.flashxpdfreader;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.util.FitPolicy;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

 public class RecylerAdapter extends RecyclerView.Adapter<RecylerAdapter.ViewHolder>{
List<File> pdf;
  private Interface inter;


public RecylerAdapter(List<File> pdf)
{
    this.pdf=pdf;
}

@Override
public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    View view =layoutInflater.inflate(R.layout.single_row,parent,false);
    ViewHolder viewHolder= new ViewHolder(view);
    return  viewHolder;

}

@Override
public void onBindViewHolder( ViewHolder holder, int position) {
    holder.pdfsize.setText(String.valueOf(position));
    holder.pdfname.setText(pdf.get(position).getName());



          
   
}

@Override
public int getItemCount() {
    return pdf.size();
}

class  ViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView pdfname,pdfsize;
    public ViewHolder( View itemView) {
        super(itemView);

        imageView = itemView.findViewById(R.id.imageView);
        pdfname = itemView.findViewById(R.id.pdfname);
        pdfsize=itemView.findViewById(R.id.pdfsize);
 itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    inter.onItemClick(getAdapterPosition());
}
});
    }



}
}

This is my ViewpagerAdapter code

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> fragmentlist=new ArrayList<>();
private final List<String> fragmentTitleList=new ArrayList<String>();
public ViewPagerAdapter(@NonNull FragmentManager fm) {
    super(fm);
}

@NonNull
@Override
public Fragment getItem(int position) {
    return fragmentlist.get(position);

}



@Override
public int getCount() {
    return fragmentlist.size();
}
public void addFragment(Fragment fragment,String title)
{
    fragmentlist.add(fragment);
    fragmentTitleList.add(title);
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return fragmentTitleList.get(position);
}
}

This is my DocumentsFragment code:

public class DocumentsFragment extends Fragment {

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
RecyclerView recyclerView;
RecylerAdapter recyclerAdapter;
List<File> pdf=new ArrayList<>();
File file;


public DocumentsFragment() {

}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment DocumentsFragment.
 */
// TODO: Rename and change types and number of parameters
public static DocumentsFragment newInstance(String param1, String param2) {
    DocumentsFragment fragment = new DocumentsFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
   View view= inflater.inflate(R.layout.fragment_documents, container, false);
   file = new File(Environment.getExternalStorageDirectory().toString());
   getlistfiles(file);
    recyclerView=view.findViewById(R.id.recview);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setAdapter(new RecylerAdapter(pdf));
    return view;
}
private List<File> getlistfiles(File direc)
{
    File[] doc=direc.listFiles();
    for(File docs:doc)
    {
        if(docs.isDirectory())
        {
            getlistfiles(docs);
        }
        else
        {

            if (docs.getName().endsWith(".pdf")) {

                pdf.add(docs);
            }
        }

    }
    return pdf;
}

}

Solution

  • You are attaching ViewPager and also DocumentFramgent both at same time, I assume mainContainer has DocumentFragment and Viewpager also has DocumentFragment, which is causing the issue

    If you want only one fragment, then can remove 4th line in onCreate of MainActivity

    replace(R.id.maincontainer,new DocumentsFragment()).commit();//remove this line
    

    or

    If you want both, then in ViewPager you need to add backgroundColor, clickable and focusable so underlying fragment won't be visible and touchable

    android:background="@color/<yourbackgroundcolor>"
    android:clickable="true"
    android:focusable="true"