片段的内容被复制到另一个片段

时间:2015-10-03 12:56:47

标签: android android-recyclerview

我遇到了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;
    }

2 个答案:

答案 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 );