2

ハッシュマップを使用して実装された複数行のリストビューがあります。データベースからデータを取得します。

データベースに追加されているアイテムを追加する別のアクティビティがあります。これで、保存ボタンを押すと、新しく追加されたアイテムが、フラグメントに実装されているリストビューにすぐに表示されます。このアクティビティでリストビューを更新する方法がわかりません。

これがリストビューを実装する私のフラグメントです:

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 が発生するためです。次のように、フラグメントのタグを取得し、それをアクティビティ クラス変数に格納して、さらにアクセスできるようにすることで、回避策を試すことができます。

アクティビティ クラスで、プライベート String 変数とその 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 に答える