У меня есть приложение, в котором я использую слайд-вкладки с фрагментом, и в каждом фрагменте у меня есть recyclerview с пользовательским адаптером, у меня есть 5 вкладок, теперь приложения работают нормально, пока я слажу, отображаются правильные данные, первые 4 вкладки используют один и тот же макет для адаптера recyclerview, который пятый не делает, теперь, если я нажму 4-ю вкладку, приложение выйдет из строя, он говорит, что не может получить текстовое представление после отладки, я обнаружил, что макет передан адаптер и идентификаторы текстовых просмотров не совпадают, поэтому в этом случае макет для 4-й вкладки передается адаптеру, но идентификаторы текстовых просмотров относятся к 5-й вкладке, в которой макет отличается, почему это происходит? это как адаптер в фрагменте выглядит:RecyclerView in Fragment with slide Tabs
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_two, container, false);
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
DisplayMetrics metrics = getResources().getDisplayMetrics();
List<Info> mDataset = new ArrayList<Info>();
mDataset.add(new Info("Display", Build.DISPLAY,""));
mDataset.add(new Info("Width", width+" px",""));
mDataset.add(new Info("Height", height+" px",""));
mDataset.add(new Info("Density", ""+metrics.density,""));
if (v != null) {
mRecyclerView = (RecyclerView) v.findViewById(R.id.my_recycler_view2);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mAdapter = new MyAdapter(mDataset, getContext(), "Display");
mRecyclerView.setAdapter(mAdapter);
}
return v;
}
И это адаптер, я использую тот же адаптер в каждом фрагменте:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Info> mDataset;
private int mLayout;
private Context mContext;
private static int mTextInfoA;
private static int mTextInfoB;
private static int mTextInfoC;
private static String mFragment;
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(List<Info> mDataset, Context mContext, String mFragment) {
this.mDataset = mDataset;
this.mContext = mContext;
this.mFragment = mFragment;
if(mFragment.equals("Device") || mFragment.equals("Battery") || mFragment.equals("Display") || mFragment.equals("Ram")) {
this.mLayout = R.layout.cardview_layout;
this.mTextInfoA = R.id.info_name;
this.mTextInfoB = R.id.info_value;
} else if(mFragment.equals("Storage")){
this.mLayout = R.layout.cardview_storage_layout;
this.mTextInfoA = R.id.storage_total_value;
this.mTextInfoB = R.id.storage_free_value;
this.mTextInfoC = R.id.storage_textview;
}
}
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(mLayout, parent, false);
ViewHolder vHolder = new ViewHolder(v);
return vHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Info info = mDataset.get(i);
viewHolder.mTextInfoa.setText(info.a);
viewHolder.mTextInfob.setText(info.b);
if (!info.c.isEmpty()) {
if (info.c.equals("Internal Storage")) {
viewHolder.mTextInfoc.setBackgroundColor(Color.parseColor("#2196F3"));
} else if (info.c.equals("External Storage")) {
viewHolder.mTextInfoc.setBackgroundColor(Color.parseColor("#F44336"));
}
viewHolder.mTextInfoc.setText(info.c);
}
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextInfoa;
public TextView mTextInfob;
public TextView mTextInfoc;
public ViewHolder(View itemView) {
super(itemView);
mTextInfoa = (TextView) itemView.findViewById(mTextInfoA);
mTextInfob = (TextView) itemView.findViewById(mTextInfoB);
mTextInfoc = (TextView) itemView.findViewById(mTextInfoC);
}
}
Нажатие на первых трех вкладок его нормально, но если я m на 1-й вкладке, и я нажимаю прямо на 4-й или 5-й, он сбой с этой ошибкой.
Моя активность OnCreate Метод:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
Моя основная раскладка:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
Добавьте полную ошибку стека ошибки. Также покажите свой адаптер ViewPager. Возможно, что-то вне этого кода вызывает проблему. –
@ DanielNugent Я обновил свой пост plz check – user3051949