0

この問題を解決するのは苦労しています。私は、カスタムオブジェクトの3つの異なるarraylistsを、展開可能なリストビューのクリックからフラグメントに送信しようとしています。ここで拡張可能なリストビューのコードは、(私は最初のグループの位置や子供が含まれているが、実際に多くのがある)である。フラグメントにArrayListオブジェクトを渡す

*/ 
public class MyWorkout extends BaseActivity{ 

ExpandableListView expandableListView; 
HashMap<String, List<String>> Workouts_details; 
List<String> Workout_list; 
WorkoutsAdapter mAdapter; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_workout); 
    mToolBar = activateToolbar(); 
    setUpNavigationDrawer(); 


    expandableListView = (ExpandableListView) findViewById(R.id.listViewWorkouts); 
    Workouts_details = DataProvider.getInfo(); 
    Workout_list = new ArrayList<>(Workouts_details.keySet()); 
    mAdapter = new WorkoutsAdapter(this, Workouts_details, Workout_list); 



    expandableListView.setAdapter(mAdapter); 

    expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
      if (groupPosition == 0) { 
       if (childPosition == 0) { 
        Intent intent = new Intent(getApplicationContext(), WorkoutDaysActivity.class); 
        intent.putExtra("workout", "w29w1"); 
        startActivity(intent); 
       } 
       if (childPosition == 1) { 
        Intent intent = new Intent(getApplicationContext(), WorkoutDaysActivity.class); 
        intent.putExtra("workout", "w29w1"); 
        startActivity(intent); 
       } 

そこから、各childClickは、3つのタブが設定されているWorkoutDaysActivityにアプリを送信します破片でこのクラスのコードは次のとおりです。

public class WorkoutDaysActivity extends BaseActivity{ 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workout_days); 
    mToolBar = activateToolbar(); 
    setUpNavigationDrawer(); 


    ViewPager vp = (ViewPager) findViewById(R.id.view_pager); 
    this.addPages(vp); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
//  tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    tabLayout.setupWithViewPager(vp); 
    tabLayout.setOnTabSelectedListener(listener(vp)); 

} 

//ADD ALL PAGES 
private void addPages(ViewPager pager) { 
    MyFragPagerAdapter adapter = new MyFragPagerAdapter(getSupportFragmentManager()); 
    Intent intent = getIntent(); 
    String workout = intent.getStringExtra("workout"); 
    Bundle args = new Bundle(); 
    args.putString("workout", workout); 

    MondayFragment mondayFragment = new MondayFragment(); 
    mondayFragment.setArguments(args); 
    adapter.addPage(mondayFragment); 
    WedFragment wedFragment = new WedFragment(); 
    wedFragment.setArguments(args); 
    adapter.addPage(wedFragment); 
    FridayFragment fridayFragment = new FridayFragment(); 
    fridayFragment.setArguments(args); 
    adapter.addPage(fridayFragment); 
    pager.setAdapter(adapter); 
} 

private TabLayout.OnTabSelectedListener listener(final ViewPager pager) { 
    return new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      pager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }; 
} 
} 

次に、3つのタブフラグメントクラスがあります。各クラスは次のようになります。

public class WedFragment extends Fragment { 

Bundle args = getArguments(); 
String workout3 = args.getString("workout"); 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.wed_fragment, null); 

//  //RECYCLERVIEW 
    RecyclerView rv = (RecyclerView) view.findViewById(R.id.mRecyclerWed); 
    rv.setLayoutManager(new LinearLayoutManager(this.getActivity())); 
    rv.setAdapter(new MyRecyclerAdapter(this.getActivity(), getWedWorkout())); 

    return view; 


} 

private ArrayList<Workout> getWedWorkout() { 
    //COLLECTION OF MONDAY WORKOUT 

    ArrayList<Workout> workout = new ArrayList<>(); 
    switch(workout3) { 
     case "w29w1" : { 
      Workout workouts = new Workout("Bench", "60", "6", "155", false); 

      //ADD TO COLLECTION 
      workout.add(workouts); 

      workouts = new Workout("Bench", "70", "5", "175", false); 
      workout.add(workouts); 

      break;} 
     case "w29w2" :{ 
      Workout workouts = new Workout("Squat", "60", "6", "155", false); 

      //ADD TO COLLECTION 
      workout.add(workouts); 

      workouts = new Workout("Squat", "70", "5", "175", false); 
      workout.add(workouts); 

     break;} 
    } return workout; 



    //SINGLE EXERCISE 


} 

@Override 
public String toString() { 
    return "Wednesday"; 
} 
} 

編集:これは私が投稿しようとしていた理由です。私の心の中ではうまくいくはずですが、実際はそうではありません。アプリはフラグメントとクラッシュを開こうとすると、私はこのエラーを取得:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bestworkouts.sheikoworkout/com.bestworkouts.sheikoworkout.WorkoutDaysActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
                       at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:158) 
                       at android.app.ActivityThread.main(ActivityThread.java:7229) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                       at com.bestworkouts.sheikoworkout.Fragments.WedFragment.<init>(WedFragment.java:24) 
                       at com.bestworkouts.sheikoworkout.WorkoutDaysActivity.addPages(WorkoutDaysActivity.java:47) 
                       at com.bestworkouts.sheikoworkout.WorkoutDaysActivity.onCreate(WorkoutDaysActivity.java:27) 
                       at android.app.Activity.performCreate(Activity.java:6876) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)  
                       at android.app.ActivityThread.access$1100(ActivityThread.java:222)  

答えて

1

コード内であなたがFragmentArrayListオブジェクトを送信しようとしているところそれは明らかではない - しかし、私の提案はあなたを作ることになりますのクラス(Workoutは)Parcelableを拡張して、ArrayList<Workout>を送信するために - あなたはBundleクラスのputParcelableArrayList(String key, ArrayList<? extends Parcelable> value)メソッドのシグネチャを使用して、fragment.setArguments(Bundle)メソッドの引数としてBundleを設定することができます。基本的に、あなたはこのようなコードになります:

ArrayList<Workout> workoutList = new ArrayList<Workout>(); 
workoutList.add(<some-workout-object>) 
Bundle bundle = new Bundle(); 
bundle.putParcelableArrayList("mondayWorkoutList", workoutList); 
Fragment fragment = new MondayFragment(); 
fragment.setArguments(bundle); 

をバンドルを使用してフラグメントに引数を送信する方法の例についてはFragment tutorialを見てください。 API documentation for Bundle class

私はこれがいくつかの光を放つことを願っています。

+0

ありがとう、私はこれを試してみます。 WorkoutクラスでParcelableを拡張するときに、 "writeToParcel"と "describeContents"を実装する必要がある2つのメソッドには何を入れますか? – LBJ33

+0

オリジナルの投稿コードを編集して元々は何をしようとしていたのかを表示しています。なぜこれがうまくいかないのか分かりません:( – LBJ33

関連する問題