[英]How to solve issue of Viewpager in a fragment?
這是我的應用程序的圖像 在此處輸入圖像描述
我卡在正確的選項卡 position 上加載片段。 每當我運行我的應用程序時,我的第一個選項卡中的片段都會顯示在 viewpager 的所有選項卡中,並且第一個選項卡文件也會再次顯示在片段上。
這是我的 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 {
}
}
這是我的 recyclerAdapter 代碼
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());
}
});
}
}
}
這是我的 ViewpagerAdapter 代碼
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);
}
}
這是我的 DocumentsFragment 代碼:
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;
}
}
您同時附加ViewPager
和DocumentFramgent
,我假設mainContainer
有DocumentFragment
並且Viewpager
也有DocumentFragment
,這導致了問題
如果您只想要一個片段,則可以刪除MainActivity
的onCreate
中的第 4 行
replace(R.id.maincontainer,new DocumentsFragment()).commit();//remove this line
或者
如果你想要兩者,那么在ViewPager
中你需要添加backgroundColor
, clickable
和focusable
,這樣底層fragment
將不可見和不可觸摸
android:background="@color/<yourbackgroundcolor>"
android:clickable="true"
android:focusable="true"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.