在同一活动2片段之间发送的ArrayList [英] Sending ArrayList between 2 fragments on same Activity
问题描述
我有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.projectmeE / 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屋!