2

我有一个多行列表视图,使用 hashmaps 实现。我从数据库中获取数据。

我有另一个活动,我正在添加我的项目,这些项目正在添加到数据库中。现在,当按下保存按钮时,新添加的项目应立即出现在片段中实现的列表视图中。我不知道如何刷新此活动中的列表视图。

这是我实现 listview 的片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {             
            myView = inflater.inflate(R.layout.fragment_layout, container, false);



            l = db.getAllEntries();

            list = (ListView) myView.findViewById(R.id.entrylist);
            mylist = new ArrayList<HashMap<String,String>>();


            HashMap<String,String> item;


            while(!l.isEmpty()){

                e = l.get(0);
                l.remove(0);

              item = new HashMap<String,String>();

              item.put( "line1", e._totime + " - " + e._totime);
              item.put( "line2", e._subject);
              item.put( "line3", e._place);
              mylist.add(n++,item);
            }

              sa = new SimpleAdapter(getActivity(), mylist,
                        R.layout.multi_line,
                        new String[] { "line1","line2", "line3" },
                        new int[] {R.id.line_a, R.id.line_b, R.id.line_c}); 

            list.setAdapter(sa);
return myView;
    }

在这个活动中,我将项目添加到数据库中,它应该立即出现在我上面的列表视图中:

public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.save:



      sub = subject.getText().toString();
      teach = teacher.getText().toString();
      pla = place.getText().toString();
      da = day.getSelectedItem().toString();
      fro = fromtime.getText().toString();
      to = totime.getText().toString();


      i = new Entries(sub,teach,pla,da,fro,to);
      db.addEntry(i);



      FragmentView1 f = (FragmentView1) this.getSupportFragmentManager().findFragmentByTag(FragmentView1.class.getName());


      l = db.getAllEntries();
      HashMap<String,String> map;


      while(!l.isEmpty()){

        e = l.get(0);
        l.remove(0);

        map = new HashMap<String,String>();

        map.put( "line1", e._fromtime + " - " + e._totime);
        map.put( "line2", e._subject);
        map.put( "line3", e._place);
        f.getArrayList().add(n++,map);    //nullpointerexception here
      }
      f.getMyListAdapter().notifyDataSetChanged();


        /*Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.save) + " menu option",
                    Toast.LENGTH_SHORT).show();*/
        return true;


  default:
        return super.onOptionsItemSelected(item);
  }

}

4

2 回答 2

1

这可能是因为 findFragmentByTag() 无法找到所需的片段,因此返回 null,导致尝试访问它时出现 NullPointerException。您可以通过检索片段的标签并将其存储在活动类变量中以供进一步访问来尝试解决方法,如下所示:

在您的活动类中,为它声明一个私有字符串变量和 getter/setter 方法:

    public String fragmentView1Tag;

public String getfragmentView1Tag() {
    return fragmentView1Tag;
}

public void setfragmentView1Tag(String fragmentView1Tag) {
    this.fragmentView1Tag = fragmentView1Tag;
}

在 FragmentView1 类中,检索片段的标签并设置 fragmentView1Tag 变量:

    String tag = getTag();
    ((YourActivityName) getActivity()).setfragmentView1Tag(tag);

现在在活动类中检索片段时,使用上面的 getter 方法:

    FragmentView1 f = (FragmentView1) this.getSupportFragmentManager().findFragmentByTag(getfragmentView1Tag);
于 2013-01-31T23:39:50.000 回答
0

使用游标从数据库中获取所有行。然后使用光标适配器填充列表。向数据库添加新行后,只需调用 notifyDataSetChanged(); 在光标适配器上。

于 2013-01-31T16:36:21.907 回答