6

Ich möchte eine ListView in einem Fragment aktualisieren, wenn ein Dialog geschlossen wird. Bis jetzt funktioniert die Aktualisierung nur, wenn ich die App neu starte und ich weiß nicht warum.Wie aktualisiert man ListView in Fragment, das mit BaseAdapter gefüllt ist?

Hier sind die Klassen:

Dies ist das Fragment mit dem Listview darauf, dass ich aktualisieren möchten, wenn der Dialog geschlossen wird.

public class RegisterListFragment extends Fragment { 


    public static final String TAG = "RegisterListFragment"; 

    RegisterListAdapter adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     setRetainInstance(true); 
     // TODO Auto-generated method stub 

     View view = inflater.inflate(R.layout.act_select_list_fragment, container, false); 


     ListView list = (ListView) view.findViewById(R.id.register_list); 
     list.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
            long arg3) { 
       Intent i = new Intent(getActivity(), com.example.smartkasse.Act_Register.MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       TextView selectedRegisterTextView = (TextView) arg1.findViewById(R.id.title); 
       String selectedRegisterName = (String) selectedRegisterTextView.getText(); 
       i.putExtra("selectedRegisterName", selectedRegisterName); 
       startActivity(i); 
       getActivity().finish(); 
      } 
     }); 
     adapter = new RegisterListAdapter(getActivity()); 
     list.setAdapter(adapter); 

     return view; 
    } 


    public void refreshData() { 
     adapter.notifyDataSetChanged(); 
    } 
} 

Und dies ist der Adapter ich die Liste füllen mit:

public class RegisterListAdapter extends BaseAdapter { 
    View view = null; 

    Database db = new Database(mContext); 
    data=db.getAlltitles(); 
    if(convertView==null) 

    { 

     view = (View) inflater.inflate(R.layout.act__select_listview, null); 

     TextView title = (TextView) view.findViewById(R.id.title); 
     TextView artist = (TextView) view.findViewById(R.id.artist); 
     TextView duration = (TextView) view.findViewById(R.id.duration); 
     ImageView thumb_image = (ImageView) view.findViewById(R.id.list_image); 

     title.setText(data.get(position)); 
     //artist.setText(data.get(position)); 
     //duration.setText(data.get(position)); 
     //thumb_image.setImageResource(R.drawable.ic_launcher); 

     return view; 
    } 

    else 

    { 

     TextView title = (TextView) convertView.findViewById(R.id.title); 
     TextView artist = (TextView) convertView.findViewById(R.id.artist); 
     TextView duration = (TextView) convertView.findViewById(R.id.duration); 
     ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); 

     title.setText(data.get(position)); 
     // artist.setText(data.get(position)); 
     // duration.setText(data.get(position)); 
     //thumb_image.setImageResource(R.drawable.ic_launcher); 

     return convertView; 
    } 
} 

Und das ist die Haupt, die alles zusammenhält:

Wenn die positv-Taste des Dialog gedrückt wird, dann Neue Daten werden zu der Datenbank hinzugefügt, die ich möchte

in der listView "be Hinter "dem Dialog. Ich habe so viel versucht, aber ich habe es wirklich nicht verstanden. Hoffe, du kannst mir helfen.

Thanks :)

+0

Es ist nicht gute Idee, Daten in UI-Thread zu laden. Werfen Sie einen Blick auf CursorLoader (http://developer.android.com/reference/android/content/CursorLoader.html) oder benutzerdefinierte AsyncTaskLoader. Um Ihr Problem einfach zu lösen, müssen Sie eine neue Instanz Ihres Adapters erstellen und auf ListView setzen. – JustAnotherCoder

Antwort

4

können Sie dies

public void refresh(){ 
    adapter = new RegisterListAdapter(getActivity()); 
    list.setAdapter(adapter); 
} 

Listenansicht oder halten die Daten im Speicher mit einem anderen Adapter zu aktualisieren.

EDIT: Leider habe ich nicht gut gelesen hätte Ihre Frage zum ersten Mal, können Sie dies in Ihrem Adapter schreiben:

public void addNewRow(String row){ 
    this.data.add(row); 
    this.notifyDataSetChanged(); 
} 
+0

Ja, das hat für mich funktioniert. Aber ich denke, das ist nicht die "beste Methode" dafür. Weißt du, wie man dieses Problem netter löst? Auf diese Weise könnte ich auch getActivity.findViewbyId (R.id.list) aufrufen und dann einen neuen Adapter hinzufügen. Ich denke, das ist nicht die Art, wie du das tust. – wirthual

0

Versuchen ListView.invalidateViews() Refresh Inhalt

+0

Ich habe list.invalidateViews anstelle von adapter.notifyDataSetChanged(); aber es hat auch nicht funktioniert -.- ' – wirthual

+0

Seien Sie sicher, dass Ihre Daten vor dem Anruf geändert werden. Database.getAlltitles() - ist zurückgegeben Ergebnis geändert anywhen? – matreshkin

+0

Das Seltsame ist, dass wenn das erste Item hinzugefügt wird und ich die Activity schließe und es erneut starte, dann funktioniert es. Ich bin wirklich verwirrt. – wirthual