ListFragment中的ListView不断累积数据

时间:2015-08-28 01:18:44

标签: android listview android-fragmentactivity

我无法使用新数据刷新ListFragment中的ListView。而是将新数据添加到上一个数据中。

每个实体的时间段从早上6点到下午5点。然后将新数据附加到在早上6点为另一个实体重新启动的列表中。在将第二个实体添加到ListView之前,应清除第一个实体的数据。

以下是代码:

public class FragmentStatePagerSupport extends FragmentActivity {

   static final int NUM_ITEMS = 4; //control number of fragments
   MyAdapter mAdapter;
   ViewPager mPager;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.fragment_main);

       mAdapter = new MyAdapter(getSupportFragmentManager());
       mPager = (ViewPager)findViewById(R.id.pager);
       mPager.setAdapter(null);
       mPager.setAdapter(mAdapter);
   }

   //===============================================================================================
   public static class MyAdapter extends FragmentStatePagerAdapter {

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

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

       @Override
       public Fragment getItem(int position) {
           fragNumber = position;
           return ArrayListFragment.newInstance(position);
       }
   }

   //===============================================================================================
   public static class ArrayListFragment extends ListFragment  {
       Integer mNum;
       String FORMAT_LINE = "%s%7s%7s%10s%16s";

       static ArrayListFragment newInstance(int num) {
           ArrayListFragment f = new ArrayListFragment();
           Bundle args = new Bundle();
           args.putInt("num", num);
           f.setArguments(args);
           return f;
       }

       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           mNum = getArguments() != null ? getArguments().getInt("num") : 1;
       }

       @Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                Bundle savedInstanceState) {
           View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
           View tv = v.findViewById(R.id.text);
           View tvd = v.findViewById(R.id.tv_description);

           String title = "";
           switch (mNum){
               case 0:title = MyGlobals.getInstance().getToday();break;
               case 1:title = MyGlobals.getInstance().getTomorrow();break;
               case 2:title = MyGlobals.getInstance().getDayAfter();break;
               case 3:title = MyGlobals.getInstance().getDayDayAfter();break;
           }

           ((TextView) tv).setText(MyGlobals.getInstance().getName() + " on " + title);
           ((TextView) tvd).setText(String.format(FORMAT_LINE, "time", "temp", "rain", "wind", "weather"));
           return v;

       }


       @Override
       public void onActivityCreated(Bundle savedInstanceState) {
           super.onActivityCreated(savedInstanceState);
           ArrayList<Data> row = Data.getRows(mNum);
           ListViewAdapter adapter = new ListViewAdapter(getActivity(), row);
           getListView().setAdapter(null);
           getListView().setAdapter(adapter);
       }


       @Override
       public void onListItemClick(ListView l, View v, int position, long id) {
           v.setBackgroundColor(getResources().getColor(R.color.blue));

       }
   }

   //==============================================================================================
   public static class ListViewAdapter extends ArrayAdapter<Data> {

       public static class ViewHolder{
           TextView time;
           TextView temp;
           TextView rain;
           TextView wind_speed;
           TextView weather;
       }

       public ListViewAdapter(Context context, ArrayList<Data> list) {super(context, R.layout.text_listview, list); }

           @Override
           public View getView(int position, View convertView, ViewGroup parent) {
               Data data = getItem(position);
               ViewHolder holder;
               if(convertView == null){
                   holder=new ViewHolder();
                   LayoutInflater inflater = LayoutInflater.from(getContext());
                   convertView=inflater.inflate(R.layout.text_listview,parent,false);
                   holder.time=(TextView) convertView.findViewById(R.id.time);
                   holder.temp=(TextView) convertView.findViewById(R.id.temp);
                   holder.rain=(TextView) convertView.findViewById(R.id.rain);
                   holder.wind_speed=(TextView) convertView.findViewById(R.id.wind);
                   holder.weather=(TextView) convertView.findViewById(R.id.weather);
                   convertView.setTag(holder);
               }else{
                   holder=(ViewHolder) convertView.getTag();
               }
               holder.time.setText(data.time);
               holder.temp.setText(data.temp);
               holder.rain.setText(data.rain);
               holder.wind_speed.setText(data.wind_speed);
               holder.weather.setText(data.weather);
               return convertView;
           }
   }
}

这最后一部分填充了ListView。调用adapter.clear()和adapter.notifyDataSetChanged()不能解决问题。

3年前有一个类似的问题How update ListView in ListFragment from FragmentActivity?尽管有6836次观看,仍然没有被接受的答案。

非常感谢。

请求的GetRows(mNum)部分:

public class Data {
  public String time;
  public String temp;
  public String rain;
  public String wind_speed;
  public String weather;

  public Data(String time, String temp, String rain, String wind_speed, String weather) {
    this.time = time;
    this.temp = temp;
    this.rain = rain;
    this.wind_speed = wind_speed;
    this.weather = weather;

  }

  public static ArrayList<Data> getRows(int fragNumber) {

    int mNum = fragNumber;
    int size;
    String myList[] = null;

    ArrayList<Data> list = new ArrayList<Data>();

    switch (mNum) {
        case 0://Today
            size = MyGlobals.getInstance().getToday("time").size();
            myList = new String[size];
            for (int i = 0; i < size; i++) {
                String time = (String) MyGlobals.getInstance().getToday("time").get(i);
                String temp = (String) MyGlobals.getInstance().getToday("temperature").get(i);
                String wind_speed = (String) MyGlobals.getInstance().getToday("wind_speed").get(i);
                String pop = (String) MyGlobals.getInstance().getToday("pop").get(i);
                //String wind_gust = (String) MyGlobals.getInstance().getToday("wind_gust").get(i); //when null breaks code
                String weather = (String) MyGlobals.getInstance().getToday("weather").get(i);

                if (time.length() == 4) time = "0" + time;
                if (wind_speed.length() == 1) wind_speed = "0" + wind_speed;
                if (pop.length() == 1) pop = "0" + pop;
                list.add(new Data(time,temp,pop,wind_speed,weather));

            }
            return list;
        case 1://Tomorrow
            ...snip... same as above with pertinent variables,...
        case 2://DayAfter
            ...snip...
        case 3://DayDayAfter
            ...snip....
        case 4:// is an error
            Log.d("***error***", "list got to case 5");
    }
     return list;
   }
}

1 个答案:

答案 0 :(得分:0)

试试这个;

  • 在将新的数据列表添加到现有列表之前,请使用list.clear();
  • 将新数据添加到列表中,您应该只在列表中添加新数据..
  • 将列表传递给适配器类。
  • 通知新数据的适配器,即adapter.notifyDataSetChanged()

    您在getRows()

  • 中返回两次列表
  • 删除案例结构

    之前的“返回列表”

    public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //在添加新列表之前清除旧列表。 if(list!= null) { list.clear(); } //添加新列表

    list = Data.getRows(mNum); ListViewAdapter适配器=新 ListViewAdapter(getActivity(),list); getListView()setAdapter(适配器)。 adapter.notifyDataSetChange(); }