0

Fragment で ListView を更新しようとしていますが、実際に機能する唯一の方法は、新しいフラグメントをインスタンス化する場合です。adpter.notifyDataSetChanged() が機能していませんか? どうして?アクティビティとフラグメントのコード:

public class TimerList extends Activity{

private DataSource datasource;
TimerListFragment timerfragment;
IntervalListFragment intervalfragment;
public List<TimerObject> values;
public String name;
public String intervals;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.interval_fragment_container);
    datasource = new DataSource(this);
    datasource.open();
    values = datasource.getAllComments();

    if (savedInstanceState == null) {

        Toast.makeText(getApplicationContext(), "MADE NEW FRAGMENTS", Toast.LENGTH_SHORT).show();
         timerfragment = new TimerListFragment();
         intervalfragment = new IntervalListFragment();

    }

}





public void delete(Long position){

    TimerObject timerobject = datasource.getTimerObject(position);
    datasource.deleteComment(timerobject);
    values = datasource.getAllComments();
}

@Override
protected void onStart() {


    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, timerfragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();


    super.onStart();
}

そして私のフラグメント:

public class TimerListFragment extends ListFragment {

List<TimerObject> values ;
Activity a;
ArrayAdapter<TimerObject> adapter;
ListView lv;


@Override
public void onCreate(Bundle savedInstanceState) {

    setHasOptionsMenu(true);
    values = ((TimerList)getActivity()).getValues();
    setBar();
     adapter = new ArrayAdapter<TimerObject>(getActivity(), android.R.layout.simple_list_item_1, values);
     setListAdapter(adapter);
     super.onCreate(savedInstanceState);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {


    ((TimerList)getActivity()).play(Long.valueOf(position));
    super.onListItemClick(l, v, position, id);
}





public void setBar(){

        ActionBar actionbar = getActivity().getActionBar();
        actionbar.setTitle("Timer List");

}

public void update(){
    setBar();
    Toast.makeText(getActivity(), "UPDATE", Toast.LENGTH_LONG).show();
    values = ((TimerList)getActivity()).getValues();
    adapter.notifyDataSetChanged();

}



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

    return view;

}



@Override
public void onStart() {
    update();
    lv = getListView();
    lv.setOnItemLongClickListener(new OnItemLongClickListener() {
         public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {

              final TimerObject selected = adapter.getItem(position);
              final Dialog d = new Dialog(getActivity());
              d.setContentView(R.layout.interval_deletetimer_dialog);
              d.setTitle("Delete " + selected.getComment() + "?" );
              ImageButton delete = (ImageButton) d.findViewById(R.id.delete);
              delete.setOnClickListener(new OnClickListener() {
                     @Override
                         public void onClick(View v) {
                        ((TimerList)getActivity()).delete(Long.valueOf(selected.getId()));


                        update();
                        }
                     });

              d.show();

              return true;
              }
            });
    super.onStart();
}
4

1 に答える 1

0

私は似たようなことをしようとしましたが、フラグメントトランザクションをやり直すだけでこの問題を解決しました。

あなたの場合、onListItemClick()メソッド内でこれを達成できます。

これをコピーできます:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, timerfragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

onListItemClick()フラグメントのメソッドに

これにより、フラグメントがリセットされます。残念ながら、これによりリストも null に設定されます。これを回避する方法は、valuesリストをクラスのprivate static変数にすることです。TimerListFragmentそうすれば、リストに加えられた変更は「保存」されたままになり、フラグメントをリロードすると、新しく更新されたリストが取り込まれます。

お役に立てれば

于 2013-08-06T00:54:23.950 に答える