在同一活动2片段之间发送的ArrayList [英] Sending ArrayList between 2 fragments on same Activity

查看:115
本文介绍了在同一活动2片段之间发送的ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个片段和一个活动。
片段1有一个ListView和一些按钮等相对布局,
片段2具有ListView和在底部的按钮。片段2的列表视图是一个列表视图,您可以选择多个项目,当选择一个项目,它被添加到一个ArrayList(我们称为选中),或删除,如果取消,我想通过发送此ArrayList到片段1,在那里可以在(如果它们存在以及它的其他项目)添加到其自己的列表视图。我已存储在活动选定的ArrayList

活动具有以下code

 公共类AddExerciseActivity扩展AppCompatActivity实现ActionBar.TabListener {/ **
 *本{@link android.support.v4.view.PagerAdapter},将提供
 *对于每个部分的片段。我们使用
 * {@link FragmentPagerAdapter}衍生,这将让每一个
 *加载到内存中的片段。如果这成为太内存密集型,它
 *可能是最好切换到
 * {@link android.support.v4.app.FragmentStatePagerAdapter}。
 * /
SectionsPagerAdapter mSectionsPagerAdapter;/ **
 *本{@link ViewPager}将承载部分内容。
 * /
ViewPager mViewPager;
静态的ArrayList<集>套=新的ArrayList<>();字符串名称,日期;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_fragment);
    捆绑额外= getIntent()getExtras()。
    如果(临时演员!= NULL){
        名称= extras.getString(ExerciseName);
        日期= extras.getString(日期);
    }    //设置操作栏。
    最后的动作条动作条= getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setTitle(名);    //创建将返回一个片段为三个的适配器
    //活性的主要部分。
    mSectionsPagerAdapter =新SectionsPagerAdapter(getSupportFragmentManager());    //设置的ViewPager与部分适配器。
    mViewPager =(ViewPager)findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);    //当不同部分之间滑动,选择对应的
    // 标签。我们也可以使用ActionBar.Tab#select()来做到这一点,如果我们有
    //为Tab的参考。
    mViewPager.setOnPageChangeListener(新ViewPager.SimpleOnPageChangeListener(){
        @覆盖
        公共无效使用onPageSelected(INT位置){
            actionBar.setSelectedNavigationItem(位置);
        }
    });    //对于每一个应用中的部分,添加标签,操作栏。
    的for(int i = 0; I< mSectionsPagerAdapter.getCount();我++){
        //创建对应于定义的页面标题文字标签
        //适配器。同时,指定此活动的对象,它实现
        //将TabListener接口,回调(监听程序)进行时
        //这个选项卡中选择。
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(I))
                        .setTabListener(本));
    }
}@覆盖
公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){
    //当选择给定的标签上,切换到相应的页面
    //的ViewPager。
    mViewPager.setCurrentItem(tab.getPosition());
}@覆盖
公共无效onTabUnselected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){
}@覆盖
公共无效onTabReselected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){
}
/ **
 * A {@link FragmentPagerAdapter}返回对应片段
 *章节/标签/页面。
 * /
公共类SectionsPagerAdapter扩展FragmentPagerAdapter {    公共SectionsPagerAdapter(FragmentManager FM){
        超(FM);
    }    @覆盖
    公共片段的getItem(INT位置){
        //的getItem被称为实例化片段为给定的页面。
        //返回一个PlaceholderFragment(定义如下静态内部类)。
        开关(位置){
            情况下0:
                束束=新包();
                bundle.putString(日,日期);
                bundle.putInt(位置,位置);
                返回新FirstFragment();
            情况1:
                返回新SecondFragment();
        }
        返回null;
    }    @覆盖
    公众诠释的getCount(){
        //显示3总页​​数。
        返回2;
    }    @覆盖
    公共CharSequence的getPageTitle(INT位置){
        开关(位置){
            情况下0:
                返回跟踪;
            情况1:
                回到历史;
        }
        返回null;
    }
}公众的ArrayList<集> getSets(){
    返回套;
}公共无效setSets(ArrayList的<集>套){
    this.sets =套;
}
}

下面是片段1

 公共类FirstFragment扩展android.support.v4.app.Fragment {CardDatabaseAdapter2 mCardDatabaseAdapter2;TextView的workoutName;
重量的EditText,代表;
双weightCount;
INT repsCount;
ListView控件列表;
按钮加,PLUS2,减,minus2,更新;
字符串名称,日期;
INT类型,类别,计数;
运动前;
卡牌;
查看rootView;
ArrayList的<集>阵列=新的ArrayList<>();
私人AddExerciseAdapter mAddExerciseAdapter;
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
    rootView = inflater.inflate(R.layout.add_exercise_view,集装箱,FALSE);
    setHasOptionsMenu(真);
    捆绑额外= getActivity()getIntent()getExtras()。
    如果(临时演员!= NULL){
        名称= extras.getString(ExerciseName);
        类型= extras.getInt(ExerciseType);
        类别= extras.getInt(ExerciseCategory);
        日期= extras.getString(日期);
        Log.v(日,日期);
    }
    mCardDatabaseAdapter2 =新CardDatabaseAdapter2(getActivity());    Log.v(创造,项创建);    //mCardDatabaseAdapter2.insert(name,日期);
    卡=新卡(0,姓名,日期);
    Log.v(名称和放大器;日期名++日期);    EX =新的练习(名称,类型,类别);
    Log.v(锻炼收到ex.toString());
    workoutName =(TextView中)rootView.findViewById(R.id.name);
    体重=(EditText上)rootView.findViewById(R.id.textWeight);
    代表=​​(EditText上)rootView.findViewById(R.id.textRep);
    名单=(ListView控件)rootView.findViewById(R.id.rowReps);
    加上=(按钮)rootView.findViewById(R.id.plus);
    减去=(按钮)rootView.findViewById(R.id.minus);
    PLUS2 =(按钮)rootView.findViewById(R.id.plus2);
    minus2 =(按钮)rootView.findViewById(R.id.minus2);
    更新=(按钮)rootView.findViewById(R.id.update);    weightCount = 0;
    repsCount = 0;
    数= 1;    阵列=新的ArrayList<>();
    plus.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            如果(!weight.getText()。的toString()。等于()){
                weightCount = Double.parseDouble(weight.getText()的toString());
                weightCount = weightCount + 2.5;
                weight.setText(将String.valueOf(weightCount));
            }其他{
                weight.setText(将String.valueOf(2.5));
            }
        }
    });    minus.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            如果(weightCount&下; = 0.0 || weight.getText()的toString()等于()。){
                weight.setText(将String.valueOf(0.0));
            }其他{
                weightCount = Double.parseDouble(weight.getText()的toString());
                weightCount = weightCount - 2.5;
                weight.setText(将String.valueOf(weightCount));
            }
        }
    });    plus2.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            如果(!reps.getText()。的toString()。等于()){
                repsCount =的Integer.parseInt(reps.getText()的toString());
                repsCount = repsCount + 1;
                reps.setText(将String.valueOf(repsCount));
            }其他{
                reps.setText(将String.valueOf(0));
            }
        }
    });    minus2.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            如果(repsCount&下; = 0 || reps.getText()的toString()等于()。){
                reps.setText(将String.valueOf(0));
            }其他{
                repsCount =的Integer.parseInt(reps.getText()的toString());
                repsCount = repsCount - 1;
                reps.setText(将String.valueOf(repsCount));
            }
        }
    });    update.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){            如果(weight.getText()。的toString()。等于()|| weight.getText()。的toString()。等于(将String.valueOf(0.0))){
                weight.setText(将String.valueOf(0.0));
                Toast.makeText(getActivity(),您需要输入一个重!,Toast.LENGTH_SHORT).show();
            }
            否则如果(reps.getText()。的toString()。等于()|| reps.getText()。的toString()。等于(将String.valueOf(0))){
                reps.setText(将String.valueOf(0));
                Toast.makeText(getActivity(),你需要至少有1名代表!,Toast.LENGTH_SHORT).show();
            }其他{
                双TEMP2 = Double.parseDouble(weight.getText()的toString());
                INT TEMP3 =的Integer.parseInt(reps.getText()的toString());
                集合S =新集(姓名,TEMP2,TEMP3,日期);
                array.add(多个);
                //mCardDatabaseAdapter2.insert2(mCardDatabaseAdapter2.highestID(),名称,s.getWeight(),s.getReps(),日期);
                //Log.v(\"inserted数据,ID+ mCardDatabaseAdapter2.highestID()+姓名+姓名+权重+ s.getWeight()+代表+ s.getReps()+日期 +日期);
                //Log.v(\"id,mCardDatabaseAdapter2.highestID()+);
                mAddExerciseAdapter.notifyDataSetChanged();
                算上++;
            }
        }
    });
    mAddExerciseAdapter =新AddExerciseAdapter(getActivity(),R.layout.row2,数组);
    list.setAdapter(mAddExerciseAdapter);    mAddExerciseAdapter.notifyDataSetChanged();    返回rootView;}@覆盖
公共无效onCreateOptionsMenu(菜单菜单,MenuInflater气筒){
    inflater.inflate(R.menu.menu_add_exercise,菜单);
}@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    //处理动作栏项目点击这里。操作栏会
    //自动处理上点击主页/向上按钮,只要
    //你在AndroidManifest.xml中指定一个父活动。
    INT ID = item.getItemId();    如果(ID == R.id.action_done){
        意向意图=新意图(getActivity(),MainMenuActivity.class);
        如果(!array.isEmpty()){
            mCardDatabaseAdapter2.insert(姓名,日期);
            对于(集S:数组){
                mCardDatabaseAdapter2.insert2(mCardDatabaseAdapter2.highestID(),名称,s.getWeight(),s.getReps(),日期);
            }
            mCardDatabaseAdapter2.resetID();
        }
        startActivity(意向);
    }    返回super.onOptionsItemSelected(项目);
}
@覆盖
公共无效的onPause(){
    super.onPause();
}@覆盖
公共无效的onStop(){
    super.onStop();
}@覆盖
公共无效onResume(){
    super.onResume();
    ArrayList的<集> S =((AddExerciseActivity)getActivity())getSets();
    如果(!s.isEmpty()){
        对于(设置T:S){
            array.add(T);
            mAddExerciseAdapter.notifyDataSetChanged();
        }
    }
}
}

和这里是片段2

 公共类SecondFragment扩展片段{CardDatabaseAdapter2 mCardDatabaseAdapter;
ExerciseHistoryAdapter mExerciseHistoryAdapter;
AddExerciseActivity mAddExerciseActivity;
ArrayList的<集>套=新的ArrayList<>();
ArrayList的<集>选择=新的ArrayList<>();
字符串名称;
LV的ListView;
卡C;
INT X;@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
    查看rootView = inflater.inflate(R.layout.exercise_history,集装箱,FALSE);
    捆绑额外= getActivity()getIntent()getExtras()。
    如果(临时演员!= NULL){
        名称= extras.getString(ExerciseName);
    }
    mAddExerciseActivity =新AddExerciseActivity();
    mCardDatabaseAdapter =新CardDatabaseAdapter2(getActivity());
    套= mCardDatabaseAdapter.getAllSetsWithName(名);
    Log.v(阵列,sets.toString());    LV =(ListView控件)rootView.findViewById(R.id.history_list);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    lv.setOnItemClickListener(新AdapterView.OnItemClickListener(){
        @覆盖
        公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
            如果(!selected.contains(sets.get(位置))){
                lv.setItemChecked(位置,真正的);
                view.setBackgroundColor(Color.rgb(255,152,0));
                Toast.makeText(getActivity(),项目选择Toast.LENGTH_SHORT).show();
                selected.add(sets.get(位置));
            }其他{
                lv.setItemChecked(位置,FALSE);
                view.setBackgroundColor(Color.rgb(221,221,221));
                selected.remove(sets.get(位置));
                Toast.makeText(getActivity(),项目未选定,Toast.LENGTH_SHORT).show();
            }
        }
    });    按钮添加=(按钮)rootView.findViewById(R.id.add_button);
    add.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
                    ((AddExerciseActivity)getActivity())setSets(选择)。                    Toast.makeText(getActivity(),项目已成功添加,Toast.LENGTH_SHORT).show();
        }
    });    mExerciseHistoryAdapter =新ExerciseHistoryAdapter(getActivity(),R.layout.history_listview_item,套,LV);
    lv.setAdapter(mExerciseHistoryAdapter);    返回rootView;
}
}

编辑:我尝试在那里,我获得/设置数组列表。但它不工作,为已经创建的片段。

编辑2:

  20 04-23:18:48.034 598-598 / com.company.joeliomason.projectme​​E / InputEventReceiver:Exceptiondispatching输入事件。
04-23 20:18:48.034 598-598 / com.company.joeliomason.projectme
E /的MessageQueue-JNI:在异常回调的MessageQueue:
handleReceiveCallback
04-23 20:18:48.034 598-598 / com.company.joeliomason.projectme
E /的MessageQueue-JNI:java.lang.IllegalStateException:已经片段
活性
        在android.support.v4.app.Fragment.setArguments(Fragment.java:549)
        在com.company.joeliomason.projectme​​.Views.FirstFragment.setArguments(FirstFragment.java:200)
        在com.company.joeliomason.projectme.Views.AddExerciseActivity.onTabSelected(AddExerciseActivity.java:94)
        在android.support.v7.internal.app.WindowDecorActionBar.selectTab(WindowDecorActionBar.java:640)
        在android.support.v7.internal.app.WindowDecorActionBar.setSelectedNavigationItem(WindowDecorActionBar.java:414)
        在com.company.joeliomason.projectme.Views.AddExerciseActivity$1.onPageSelected(AddExerciseActivity.java:68)


解决方案

这可能会奏效,但我没有测试它。
它看起来像你可以传递一个捆绑使用在 onTabSelected()方法的新方法调用。

创建为 FirstFragment 的引用作为一个实例变量 AddExerciseActivity

  ViewPager mViewPager;
静态的ArrayList<集>套=新的ArrayList<>();
FirstFragment fragmentFirst; //添加

设置它在你的 SectionsPagerAdapter

  @覆盖
    公共片段的getItem(INT位置){
        //的getItem被称为实例化片段为给定的页面。
        //返回一个PlaceholderFragment(定义如下静态内部类)。
        开关(位置){
            情况下0:
                束束=新包();
                bundle.putString(日,日期);
                bundle.putInt(位置,位置);
                fragmentFirst =新FirstFragment(); //改性
                返回fragmentFirst; //添加
            情况1:
                返回新SecondFragment();
        }
        返回null;
    }

然后,添加,添加捆绑,并将其传递到 FirstFragment onTabSelected

  @覆盖
公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){
    //当选择给定的标签上,切换到相应的页面
    //的ViewPager。
    mViewPager.setCurrentItem(tab.getPosition());    如果(fragmentFirst!= NULL){
       束束=新包();
       bundle.putSerializable(套套);
       //fragmentFirst.setArguments(bundle); //不工作
       fragmentFirst.updateArguments(包); //尝试这个
    }}

编辑:在添加一个新的公共方法 FragmentFirst

 公共无效updateArguments(捆绑参数){
     ArrayList的<集> X =新的ArrayList<>();
     X =(ArrayList的<集>)args.getSerializable(套);
     对于(集合P:X){
        array.add(P);
     }
     mAddExerciseAdapter.notifyDataSetChanged();
   }

I have 2 Fragments and an Activity. Fragment 1 has a relative layout with a listview and some buttons etc, Fragment 2 has a ListView and a button at the bottom. fragment 2's listview is a listview where you can select multiple items, when an item is selected, it is added to an arraylist (we will call this selected) or removed if deselected, I want to send this arrayList over to Fragment 1, where it can add it to its own listview (as well as its other items if they exist). I have the selected ArrayList stored in Activity.

Activity has the following code

public class AddExerciseActivity extends AppCompatActivity implements ActionBar.TabListener {

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link FragmentPagerAdapter} derivative, which will keep every
 * loaded fragment in memory. If this becomes too memory intensive, it
 * may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */
SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
ViewPager mViewPager;
static ArrayList<Set> sets = new ArrayList<>();

String name, date;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment);
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        name = extras.getString("ExerciseName");
        date = extras.getString("date");
    }

    // Set up the action bar.
    final ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setTitle(name);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    // When swiping between different sections, select the corresponding
    // tab. We can also use ActionBar.Tab#select() to do this if we have
    // a reference to the Tab.
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        // Create a tab with text corresponding to the page title defined by
        // the adapter. Also specify this Activity object, which implements
        // the TabListener interface, as the callback (listener) for when
        // this tab is selected.
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                        .setTabListener(this));
    }
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in
    // the ViewPager.
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}




/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        switch (position) {
            case 0:
                Bundle bundle = new Bundle();
                bundle.putString("date", date);
                bundle.putInt("position", position);
                return new FirstFragment();
            case 1:
                return new SecondFragment();
        }
        return null;
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 2;
    }



    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Track";
            case 1:
                return "History";
        }
        return null;
    }
}

public ArrayList<Set> getSets() {
    return sets;
}

public void setSets(ArrayList<Set> sets) {
    this.sets = sets;
}
}

Here is Fragment 1

public class FirstFragment  extends android.support.v4.app.Fragment {

CardDatabaseAdapter2 mCardDatabaseAdapter2;

TextView workoutName;
EditText weight, reps;
double weightCount;
int repsCount;
ListView list;
Button plus, plus2, minus, minus2, update;
String name, date;
int type, category, count;
Exercise ex;
Card card;
View rootView;
ArrayList<Set> array = new ArrayList<>();
private AddExerciseAdapter mAddExerciseAdapter;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.add_exercise_view, container, false);
    setHasOptionsMenu(true);
    Bundle extras = getActivity().getIntent().getExtras();
    if (extras != null) {
        name = extras.getString("ExerciseName");
        type = extras.getInt("ExerciseType");
        category = extras.getInt("ExerciseCategory");
        date = extras.getString("date");
        Log.v("date", date);
    }
    mCardDatabaseAdapter2 = new CardDatabaseAdapter2(getActivity());

    Log.v("created", "item created");

    //mCardDatabaseAdapter2.insert(name, date);
    card = new Card(0, name, date);
    Log.v("name & date", name + "  " + date);

    ex = new Exercise(name, type, category);
    Log.v("Exercise Recieved", ex.toString());
    workoutName = (TextView) rootView.findViewById(R.id.name);
    weight = (EditText) rootView.findViewById(R.id.textWeight);
    reps = (EditText) rootView.findViewById(R.id.textRep);
    list = (ListView) rootView.findViewById(R.id.rowReps);
    plus = (Button) rootView.findViewById(R.id.plus);
    minus = (Button) rootView.findViewById(R.id.minus);
    plus2 = (Button) rootView.findViewById(R.id.plus2);
    minus2 = (Button) rootView.findViewById(R.id.minus2);
    update = (Button) rootView.findViewById(R.id.update);

    weightCount = 0;
    repsCount = 0;
    count = 1;

    array = new ArrayList<>();
    plus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!weight.getText().toString().equals("")) {
                weightCount = Double.parseDouble(weight.getText().toString());
                weightCount = weightCount + 2.5;
                weight.setText(String.valueOf(weightCount));
            } else {
                weight.setText(String.valueOf(2.5));
            }
        }
    });

    minus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(weightCount <= 0.0 || weight.getText().toString().equals("")) {
                weight.setText(String.valueOf(0.0));
            } else {
                weightCount = Double.parseDouble(weight.getText().toString());
                weightCount = weightCount - 2.5;
                weight.setText(String.valueOf(weightCount));
            }
        }
    });

    plus2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!reps.getText().toString().equals("")) {
                repsCount = Integer.parseInt(reps.getText().toString());
                repsCount = repsCount + 1;
                reps.setText(String.valueOf(repsCount));
            } else {
                reps.setText(String.valueOf(0));
            }
        }
    });

    minus2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(repsCount <= 0 || reps.getText().toString().equals("")){
                reps.setText(String.valueOf(0));
            } else {
                repsCount = Integer.parseInt(reps.getText().toString());
                repsCount = repsCount - 1;
                reps.setText(String.valueOf(repsCount));
            }
        }
    });

    update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(weight.getText().toString().equals("") || weight.getText().toString().equals(String.valueOf(0.0))) {
                weight.setText(String.valueOf(0.0));
                Toast.makeText(getActivity(), "You need to enter a weight!", Toast.LENGTH_SHORT).show();
            }
            else if(reps.getText().toString().equals("")|| reps.getText().toString().equals(String.valueOf(0))) {
                reps.setText(String.valueOf(0));
                Toast.makeText(getActivity(), "You need to have at least 1 rep!", Toast.LENGTH_SHORT).show();
            } else {
                double temp2 = Double.parseDouble(weight.getText().toString());
                int temp3 = Integer.parseInt(reps.getText().toString());
                Set s = new Set(name, temp2, temp3, date);
                array.add(s);
                //mCardDatabaseAdapter2.insert2(mCardDatabaseAdapter2.highestID(), name, s.getWeight(), s.getReps(), date);
                //Log.v("inserted data", "id " + mCardDatabaseAdapter2.highestID() + " name " + name + " weight " + s.getWeight() + " reps " + s.getReps() + " date " + date);
                //Log.v("id", mCardDatabaseAdapter2.highestID() + "");
                mAddExerciseAdapter.notifyDataSetChanged();
                count++;
            }
        }
    });
    mAddExerciseAdapter = new AddExerciseAdapter(getActivity(), R.layout.row2, array);
    list.setAdapter(mAddExerciseAdapter);

    mAddExerciseAdapter.notifyDataSetChanged();

    return rootView;

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_add_exercise, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (id == R.id.action_done) {
        Intent intent = new Intent(getActivity(), MainMenuActivity.class);
        if(!array.isEmpty()) {
            mCardDatabaseAdapter2.insert(name, date);
            for (Set s : array) {
                mCardDatabaseAdapter2.insert2(mCardDatabaseAdapter2.highestID(), name, s.getWeight(), s.getReps(), date);
            }
            mCardDatabaseAdapter2.resetID();
        }
        startActivity(intent);
    }

    return super.onOptionsItemSelected(item);
}


@Override
public void onPause() {
    super.onPause();
}

@Override
public void onStop() {
    super.onStop();
}

@Override
public void onResume() {
    super.onResume();
    ArrayList<Set> s = ((AddExerciseActivity)getActivity()).getSets();
    if(!s.isEmpty()) {
        for(Set t : s) {
            array.add(t);
            mAddExerciseAdapter.notifyDataSetChanged();
        }
    }
}
}

and here is Fragment 2

public class SecondFragment extends Fragment {

CardDatabaseAdapter2 mCardDatabaseAdapter;
ExerciseHistoryAdapter mExerciseHistoryAdapter;
AddExerciseActivity mAddExerciseActivity;
ArrayList<Set> sets = new ArrayList<>();
ArrayList<Set> selected = new ArrayList<>();
String name;
ListView lv;
Card c;
int x;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.exercise_history, container, false);
    Bundle extras = getActivity().getIntent().getExtras();
    if (extras != null) {
        name = extras.getString("ExerciseName");
    }
    mAddExerciseActivity = new AddExerciseActivity();
    mCardDatabaseAdapter = new CardDatabaseAdapter2(getActivity());
    sets = mCardDatabaseAdapter.getAllSetsWithName(name);
    Log.v("array", sets.toString());

    lv = (ListView) rootView.findViewById(R.id.history_list);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (!selected.contains(sets.get(position))) {
                lv.setItemChecked(position, true);
                view.setBackgroundColor(Color.rgb(255, 152, 0));
                Toast.makeText(getActivity(), "Item Selected", Toast.LENGTH_SHORT).show();
                selected.add(sets.get(position));
            } else {
                lv.setItemChecked(position, false);
                view.setBackgroundColor(Color.rgb(221, 221, 221));
                selected.remove(sets.get(position));
                Toast.makeText(getActivity(), "Item Unselected", Toast.LENGTH_SHORT).show();
            }
        }
    });



    Button add = (Button) rootView.findViewById(R.id.add_button);
    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                    ((AddExerciseActivity)getActivity()).setSets(selected);

                    Toast.makeText(getActivity(), "items have been added successfully", Toast.LENGTH_SHORT).show();
        }
    });

    mExerciseHistoryAdapter= new ExerciseHistoryAdapter(getActivity(), R.layout.history_listview_item, sets, lv);
    lv.setAdapter(mExerciseHistoryAdapter);

    return rootView;
}
}

EDIT: my attempt is in there, where I get/set the arrayList. but it doesnt work as the fragment is already created.

EDIT 2:

04-23 20:18:48.034      598-598/com.company.joeliomason.projectmeE/InputEventReceiver﹕ Exceptiondispatching input event.
04-23 20:18:48.034      598-598/com.company.joeliomason.projectme
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: 
handleReceiveCallback
04-23 20:18:48.034      598-598/com.company.joeliomason.projectme 
E/MessageQueue-JNI﹕ java.lang.IllegalStateException: Fragment already 
active
        at android.support.v4.app.Fragment.setArguments(Fragment.java:549)
        at com.company.joeliomason.projectme.Views.FirstFragment.setArguments(FirstFragment.java:200)
        at com.company.joeliomason.projectme.Views.AddExerciseActivity.onTabSelected(AddExerciseActivity.java:94)
        at android.support.v7.internal.app.WindowDecorActionBar.selectTab(WindowDecorActionBar.java:640)
        at android.support.v7.internal.app.WindowDecorActionBar.setSelectedNavigationItem(WindowDecorActionBar.java:414)
        at com.company.joeliomason.projectme.Views.AddExerciseActivity$1.onPageSelected(AddExerciseActivity.java:68)

解决方案

This might work, but I haven't tested it. It looks like you could pass a Bundle using a new method call in your onTabSelected() method.

Create a reference to FirstFragment as an instance variable in AddExerciseActivity:

ViewPager mViewPager;
static ArrayList<Set> sets = new ArrayList<>();
FirstFragment fragmentFirst; //added

Set it in your SectionsPagerAdapter:

@Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        switch (position) {
            case 0:
                Bundle bundle = new Bundle();
                bundle.putString("date", date);
                bundle.putInt("position", position);
                fragmentFirst = new FirstFragment(); //modified
                return fragmentFirst; //added
            case 1:
                return new SecondFragment();
        }
        return null;
    }

Then, add , add sets to a Bundle, and pass it into FirstFragment in onTabSelected:

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in
    // the ViewPager.
    mViewPager.setCurrentItem(tab.getPosition());

    if (fragmentFirst != null){
       Bundle bundle = new Bundle();
       bundle.putSerializable("sets", sets);
       //fragmentFirst.setArguments(bundle); //not working
       fragmentFirst.updateArguments(bundle); //try this
    }

}

Edit: Add a new public method in FragmentFirst:

public void updateArguments(Bundle args) { 
     ArrayList<Set> x = new ArrayList<>(); 
     x = (ArrayList<Set>) args.getSerializable("sets"); 
     for(Set p: x) { 
        array.add(p); 
     } 
     mAddExerciseAdapter.notifyDataSetChanged(); 
   } 

这篇关于在同一活动2片段之间发送的ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆