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;
}
}
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"