我遇到了RecyclerView和Fragment的问题。我有4个标签,每个标签都包含一个RecyclerView。 我的问题是,我在不同的选项卡上看到相同的结果,看起来正在复制片段。
我的主要活动:
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolBar);
final ViewPager viewPager = (ViewPager) findViewById(R.id.main_pager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.main_tabLayout);
setSupportActionBar(toolbar);
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
fragmentInvite = new InviteFragment();
attendingFragment = new AttendingFragment();
notAttendingFragment = new NotAttendingFragment();
maybeFragment = new MaybeFragment();
adapter.addFragment(fragmentInvite, "first");
adapter.addFragment(attendingFragment, "second");
adapter.addFragment(notAttendingFragment, "third");
adapter.addFragment(maybeFragment, "fourth");
viewPager.setAdapter(adapter);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setupWithViewPager(viewPager);
我的片段适配器:
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments = new ArrayList<>();
private ArrayList<String> titles = new ArrayList<>();
public void addFragment(Fragment fragment, String title){
fragments.add(fragment);
titles.add(title);
}
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
这是RecyclerViewer适配器
public class rvAdapter extends RecyclerView.Adapter<rvAdapter.CustomViewHolder> {
private static List<Contact> contacts;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class CustomViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextViewName;
public CheckBox mCheckBox;
public TextView mTextViewNumber;
public CustomViewHolder(View view) {
super(view);
this.mTextViewName = (TextView) view.findViewById(R.id.tv_name);
this.mCheckBox = (CheckBox) view.findViewById(R.id.cb_check_box);
this.mTextViewNumber = (TextView) view.findViewById(R.id.tv_number);
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public rvAdapter(List<Contact> contacts) {
this.contacts = contacts;
Log.d("TAG","constructor "+contacts.size());
}
// Create new views (invoked by the layout manager)
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.contacts_list_item, parent, false);
// set the view's size, margins, paddings and layout parameters
CustomViewHolder vh = new CustomViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(CustomViewHolder holder,int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
String name = contacts.get(position).getName();
String number = contacts.get(position).getPhone_number();
//Boolean status = contacts.get(position).isSelected();
holder.mTextViewName.setText(name);
holder.mTextViewNumber.setText(number);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return contacts.size();
}
}
第一个片段:
public class InviteFragment extends Fragment {
private RecyclerView rv_invite;
private Button btn_done;
private List<String> numbers;
private AlertDialog ratingDialog;
private String message;
public ArrayList<Contact> contacts;
private LinearLayoutManager mLayoutManager;
private rvAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_invite, container, false);
numbers = new ArrayList<>();
contacts = new ArrayList<>();
//find done button
btn_done = (Button) view.findViewById(R.id.btn_done);
//find listview
rv_invite = (RecyclerView) view.findViewById(R.id.rv_invite);
//get contacts list
setContacts(numbers);
//sorting the contact list
Collections.sort(contacts);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
//mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rv_invite.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new rvAdapter(contacts);
rv_invite.setAdapter(mAdapter);
return view;
}
第二个片段:
public class AttendingFragment extends Fragment {
private Button btn_resend;
private RecyclerView attending;
private LinearLayoutManager mLayoutManager;
private rvAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.fragment_attending, container, false);
attending = (RecyclerView) v.findViewById(R.id.attending_recycler_view);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
attending.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new rvAdapter(MainActivity.attending);
attending.setAdapter(mAdapter);
return v;
}
第三个片段:
public class NotAttendingFragment extends Fragment {
private RecyclerView rv_not_attending;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.fragment_not_attending, container, false);
rv_not_attending = (RecyclerView) v.findViewById(R.id.not_attending_recycler_view);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
rv_not_attending.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new rvAdapter(MainActivity.not_attending);
rv_not_attending.setAdapter(mAdapter);
return v;
}
第四个片段:
public class MaybeFragment extends Fragment {
private List<Boolean> status;
private RecyclerView rv_maybe;
private LinearLayoutManager mLayoutManager;
private rvAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.fragment_maybe, container, false);
rv_maybe = (RecyclerView) v.findViewById(R.id.maybe_recycler_view);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
rv_maybe.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new rvAdapter(MainActivity.maybe);
rv_maybe.setAdapter(mAdapter);
return v;
}
答案 0 :(得分:1)
问题在于适配器
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.contacts_list_item, parent, false);
// set the view's size, margins, paddings and layout parameters
CustomViewHolder vh = new CustomViewHolder(v);
return vh;
}
应该是:
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(ctx)
.inflate(R.layout.contacts_list_item, parent, false);
// set the view's size, margins, paddings and layout parameters
CustomViewHolder vh = new CustomViewHolder(v);
return vh;
}
从片段传递上下文解决了问题。 当我使用parent.getContext()时,我的细节被覆盖在另一个片段上。
答案 1 :(得分:0)
考虑到您在MainActivity中正确设置了数组,请尝试更改在片段中获取这些值的部分。
更改
mAdapter = new rvAdapter(MainActivity.maybe);
要
mAdapter = new rvAdapter( ((MainActivity.class)getActivity() ).maybe );
如果该更改没有做到这一点,请继续执行以下说明,对结果进行评论。将适配器中的contacts
字段公开,并在更改的frag代码中插入这些行以进行测试。在评论中发布日志。
Log.i( this.getClass().getSimpleName(), ">>> AdapterValue: " + mAdapter.contacts );
Log.i( "MainActivity", ">>> MainActvity value :" + ((MainActivity.class)getActivity()).maybe );