如何在片段中接收arraylist

时间:2016-01-10 14:09:52

标签: android arraylist

我需要知道如何在片段中使用Bundle获取数组列表,在examples我看到他们使用的是int或字符串。怎么得到碎片?在我的活动中,获得arraylist

是很好的

我的更新代码

public class SingleViewActivity extends FragmentActivity {
    ImageView   imageView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page_view);


        ArrayList<Listitem> personArrayList = new ArrayList<Listitem>();
// add some ListItem's...
        DemoObjectFragment f = DemoObjectFragment.newInstance(personArrayList);


        ViewPager    mViewPager = (ViewPager) findViewById(R.id.pager);
        imageView = (ImageView) findViewById(R.id.funnyimage);
        Bundle bundle = getIntent().getExtras();
        Log.d("s","singleview");
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);


/*
        DemoCollectionPagerAdapter      mDemoCollectionPagerAdapter =      new DemoCollectionPagerAdapter( getSupportFragmentManager());
        ViewPager    mViewPager = (ViewPager) findViewById(R.id.pager);
           imageView = (ImageView) findViewById(R.id.funnyimage);
        Bundle bundle = getIntent().getExtras();
        Log.d("s","singleview");
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);*/

    /*  if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            MyFragment myrag = new MyFragment();
            myrag.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, myrag).commit();
        }
*/
    }
        // Since this is an object collection, use a FragmentStatePagerAdapter,
        // and NOT a FragmentPagerAdapter.

        public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
            public static final String ARG_OBJECT = "Person_List";

            public DemoCollectionPagerAdapter(FragmentManager fm, ArrayList<Listitem> personArrayList)
            {
                super(fm);
                Log.d("s","adapterview");
            }

            @Override
            public Fragment getItem(int i) {

                Fragment fragment = new DemoObjectFragment();
                Bundle args = new Bundle();
                // Our object is just an integer :-P
                args.putInt(DemoObjectFragment.ARG_PERSON_LIST, i + 1);
                fragment.setArguments(args);
                return fragment;
            }

            @Override
            public int getCount() {
                return 100;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return "OBJECT " + (position + 1);
            }
        }
// Instances of this class are fragments representing a single
// object in our collection.
public class DemoObjectFragment extends Fragment {
    public static final String ARG_PERSON_LIST = "Person_List";

    private ArrayList<Listitem> items;

    public  DemoObjectFragment newInstance(ArrayList<Listitem> items) {
        DemoObjectFragment f = new DemoObjectFragment();
        Bundle args = new Bundle();
        args.putParcelableArrayList(ARG_PERSON_LIST, items);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        if (args.containsKey(ARG_PERSON_LIST)) {
            // UNTESTED: probably will need to cast this
            this.items = args.getParcelableArrayList(ARG_PERSON_LIST);
        } else { // avoid the NullPointerException later by initializing the list
            this.items = new ArrayList<Listitem>();
        }
        // use this.items as you wish, but it will be empty if you didn't set the Bundle argument correctly
    }
}
            @Override
            public View onCreateView(LayoutInflater inflater,
                                     ViewGroup container, Bundle savedInstanceState) {
                // The last two arguments ensure LayoutParams are inflated
                // properly.

                View rootView = inflater.inflate(
                        R.layout.fragment_collection_object, container, false);
              //  Bundle args = getArguments();
             //   ((TextView) rootView.findViewById(R.id.text1)).setText(Integer.toString(args.getInt(ARG_OBJECT)));
                Bundle args= new Bundle();



                ArrayList<Listitem> personArrayList = args.getParcelableArrayList("Person_List");
                System.out.print(personArrayList);

                System.out.print("here1");

                if (personArrayList != null && !personArrayList.isEmpty()) {
                    for (Listitem person : personArrayList) {
                        Picasso.
                                with(getActivity()).
                                load(person.url)
                                .placeholder(R.drawable.logo)
                                .fit()
                                .noFade()
                                .into(imageView);
                        Log.i("PersonsActivity",String.valueOf(person.url));
                    }
                }
                return rootView;
            }
        }
    }

我现在有2个错误: enter image description here

对于newInstance,正如我之前提到的,我不能指代不是静态的。

我现在正在为毕加索收到错误

enter image description here

编辑3 enter image description here

2 个答案:

答案 0 :(得分:2)

这是您正在寻找的内容的良好开端,并假设您已为Parcelable课程正确实施ListItem

活动中的某个地方

ArrayList<ListItem> personArrayList = new ArrayList<ListItem>();
// add some ListItem's...
DemoObjectFragment f = DemoObjectFragment.newInstance(personArrayList);

从Fragment类的顶部(注意:它不是static class

public class DemoObjectFragment extends Fragment {
    public static final String ARG_PERSON_LIST = "Person_List";

    private ArrayList<ListItem> items;

    public static DemoObjectFragment newInstance(ArrayList<ListItem> items) {
        DemoObjectFragment f = new DemoObjectFragment();
        Bundle args = new Bundle();
        args.putParcelableArrayList(ARG_PERSON_LIST, items);
        f.setArguments(args);
        return f;
   }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        if (args.containsKey(ARG_PERSON_LIST)) {
            // UNTESTED: probably will need to cast this
            this.items = args.getParcelableArrayList(ARG_PERSON_LIST);
        } else { // avoid the NullPointerException later by initializing the list
            this.items = new ArrayList<ListItem>();
        }
        /*
        * use this.items as you wish, but 
        * it will be empty if you didn't set the 
        * Bundle argument correctly
        */
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(
            R.layout.fragment_collection_object, container, false);

        ImageView imageView = (ImageView) rootView.findViewById(R.id.imageView);

        Log.i("DemoObjectFragment", "Inside onCreateView");

        if (this.items.isEmpty()) {
            Log.i("DemoObjectFragment", "Warning: There are no items!");
        }

        if (this.items != null) {
            for (Listitem person : items) {
                Picasso.with(getActivity())
                    .load(person.url)
                    .placeholder(R.drawable.logo)
                    .fit()
                    .noFade()
                    .into(imageView);
                Log.i("DemoObjectFragment", "Person URL: " + String.valueOf(person.url));
            }
        } else {
            Log.i("DemoObjectFragment", "Oh no! items is null!");
        }
        return rootView;
    }
}

答案 1 :(得分:0)

从我看到的片段无法知道你所指的personArrayList。通常在newInstance方法中将列表作为额外参数传递(步骤1),将其保存在包中(步骤2),然后从onCreate中的包中检索它(步骤3)。

要修复代码,您必须使用new ArrayList()初始化列表,但在这种情况下它会为空,或者如上所述(您只是错过了第1步,所以你几乎已经完成了。