如何刷新片段并根据其位置传递信息?

时间:2016-06-07 22:48:07

标签: java android listview android-fragments

我有一个ViewPager活动。有一个Fragment类 - ScheduleFragment和一个BroadcastReceiver。我需要的是获取信息并根据其位置填充片段中的列表。

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
  ScheduleFragment scheduleFragment = new ScheduleFragment();
  return scheduleFragment.newInstance(position + 1);
}

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

@Override
public int getItemPosition(Object object) {
  return super.getItemPosition(object);
}

@Override
public CharSequence getPageTitle(int position) {
  switch (position) {
    case 0:
      return getString(R.string.descr_monday);
    case 1:
      return getString(R.string.descr_tuesday);
    case 2:
      return getString(R.string.descr_wednesday);
    case 3:
      return getString(R.string.descr_thursday);
    case 4:
      return getString(R.string.descr_friday);
  }
  return null;
}

这里是ScheduleFragment的方法:

public ScheduleFragment newInstance(Integer day) {
    ScheduleFragment fragment = new ScheduleFragment();
    Bundle args = new Bundle();
    args.putInt("day", day);
    fragment.setArguments(args);
    return fragment;
  }
private class ScheduleBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      ArrayList<Lesson> result = (ArrayList<Lesson>) intent.getSerializableExtra("schedule");
      ArrayList<Lesson> dataToInsert = new ArrayList<>();
      Log.i("ASSSSSSSSSSSS", day.toString());
      for (Lesson lesson : result) {
        if (Objects.equals(lesson.getDay(), day)) {
          dataToInsert.add(lesson);
        }
      }

      adapter = new ScheduleListAdapter(context, result);

      SwingBottomInAnimationAdapter swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(adapter);
      swingBottomInAnimationAdapter.setAbsListView(schedule_listView);
      schedule_listView.setAdapter(swingBottomInAnimationAdapter);

      adapter.notifyDataSetChanged();
    }
  }

我还在工具栏中有一个Spinner周。所以我也想在我选择另一周时更新片段。 拜托,伙计们。帮我。我尝试了一些解决方案,但没有一个能帮助我!

希望你的帮助

2 个答案:

答案 0 :(得分:0)

我可能不是这方面的专家,但我刚刚完成了一个充满碎片的项目。肮脏的&#39;我在他们之间传递数据的方式是通过在我的项目中使用单例类来完成的。不过,这可能不是最佳解决方案。

例如,我的项目包含一个片段,我根据设置活动中的选项更新了该片段。 FamilyMap(familyMap)类是我的单例,我保留了一个设置模型,其中包含该对象中需要信息的映射。此处显示的代码是基于用户交互更新该设置模型。

public void mapTypeSelection(String selection)
{
    Log.d("Map Selection", selection);
    switch(selection)
    {
        case "Normal":
            familyMap.getMapFrag().getmMap().setMapType(GoogleMap.MAP_TYPE_NORMAL);
            familyMap.getSettings().setMapType(new Pair<String, Integer>("Normal", GoogleMap.MAP_TYPE_NORMAL));
            break;
        case "Satellite":
            familyMap.getMapFrag().getmMap().setMapType(GoogleMap.MAP_TYPE_SATELLITE);
            familyMap.getSettings().setMapType(new Pair<String, Integer>("Satellite", GoogleMap.MAP_TYPE_SATELLITE));
            break;
        case "Hybrid":
            familyMap.getMapFrag().getmMap().setMapType(GoogleMap.MAP_TYPE_HYBRID);
            familyMap.getSettings().setMapType(new Pair<String, Integer>("Hybrid", GoogleMap.MAP_TYPE_HYBRID));
            break;
        case "Terrain":
            familyMap.getMapFrag().getmMap().setMapType(GoogleMap.MAP_TYPE_TERRAIN);
            familyMap.getSettings().setMapType(new Pair<String, Integer>("Terrain", GoogleMap.MAP_TYPE_TERRAIN));
            break;
        default:
            break;
    }
}

//private method of your class
private int getIndex(Spinner spinner, String myString)
{
    int index = 0;

    for (int i=0;i<spinner.getCount();i++){
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
            index = i;
            break;
        }
    }
    return index;
}

public Pair<String, Integer> colorLineSelection(String selection)
{
    Log.d("Map Selection", selection);
    switch(selection)
    {
        case "Red":
            return new Pair<String, Integer>("Red", Color.RED);
        case "Blue":
            return new Pair<String, Integer>("Blue", Color.BLUE);
        case "Green":
            return new Pair<String, Integer>("Green", Color.GREEN);
        default:
            return null;
    }
}


@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    switch(parent.getId()){
        case R.id.mapTypeSpinner:
            mapTypeSelection((String)parent.getItemAtPosition(position));
            break;
        case R.id.lifeLineSpinner:
            FamilyMap.getInstance().getSettings().setLifeColor(colorLineSelection((String)parent.getItemAtPosition(position)));
            familyMap.getMapFrag().drawLines();
            break;
        case R.id.spouseLineSpinner:
            FamilyMap.getInstance().getSettings().setSpouseColor(colorLineSelection((String) parent.getItemAtPosition(position)));
            familyMap.getMapFrag().drawLines();
            break;
        case R.id.familyLineSpinner:
            FamilyMap.getInstance().getSettings().setFamilyColor(colorLineSelection((String) parent.getItemAtPosition(position)));
            familyMap.getMapFrag().drawLines();
            break;
        default:
            break;
    }
}

我做的另一件事是我保留了我的片段的实例 - 它是我的应用程序的主要部分,所以它对我的情况有意义。这使我能够在选择选项时更新原始片段。我还设置了片段,以便在使用startActivityForResult()达到某个结果时进行更新。

我认为将数据发送到您的片段的更好(更清晰,更可接受)选项将是对象序列化,但至少在我的情况下,事实证明这比我当时能负担的更多。

希望这至少有助于指出你正确的方向!

答案 1 :(得分:0)

所以,经过尝试,尝试和大量的尝试,我想出来了! 在newInstance方法中,我创建了Fragment的新实例,我根据片段位置添加了一天包,

public ScheduleFragment newInstance(Integer day) {
ScheduleFragment fragment = new ScheduleFragment();
Bundle args = new Bundle();
args.putInt("day", day);

fragment.setArguments(args);
return fragment;
}

然后,在片段onCreateView中,我使用getArguments().getInt("day");获取此参数并将其放入private Integer dayglob;字段,这意味着它对于每个片段都不同。 现在,当我有“一天”的时候我的片段中的变量我可以根据提供的日期将信息放入列表中:

private class ScheduleBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      ArrayList<Lesson> result = (ArrayList<Lesson>) intent.getSerializableExtra("schedule");
      ArrayList<Lesson> dataToInsert = new ArrayList<>();
      for (Lesson lesson : result) {
        if (Objects.equals(lesson.getDay(), dayglob)) {
          dataToInsert.add(lesson);
        }
      }
      adapter = new ScheduleListAdapter(context, dataToInsert);

      SwingBottomInAnimationAdapter swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(adapter);
      swingBottomInAnimationAdapter.setAbsListView(schedule_listView);
      schedule_listView.setAdapter(swingBottomInAnimationAdapter);

      try {
        getActivity().unregisterReceiver(mScheduleBroadcastReceiver);
      } catch (IllegalArgumentException e) {
        Log.i("Unregister", e.toString());
      }
    }
  }

每个片段都有自己的&#34; onReceive&#34;并且来自特定片段的服务数据。

此外,关于周微调器和根据其值更新列表:我已经创建了一个静态字段public static Spinner week_spinner;,将其初始化为我的Activity的onCreate方法然后,在片段中&#34; onCreateView&#34;我向我的数据库提出了这样的请求: requestQueue.add(connectionManager.getSchedule(this, savedUser.getGroup(), MainActivity.week_spinner.getSelectedItemPosition() + 1)); 这里唯一的问题是通过静态引用访问微调器来获取价值。 而且,我也设置了Listener,它表示像

这样的碎片
  嘿,伙计们!你不是最新的!更新自己!

 week_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    mViewPager.getAdapter().notifyDataSetChanged();
  }
});

一个小技巧可以改变FragmentPagerAdapter类中的getItemPosition(在我的例子中是SectionsPagerAdapter)

@Override public int getItemPosition(Object object) { return POSITION_NONE; }

我觉得这有点棘手,但这是我能想出来的唯一方法 我希望,这会有所帮助!