6

Chcę odświeżyć ListView w Fragment po zamknięciu okna dialogowego. Do tej pory odświeżanie działa tylko po ponownym uruchomieniu aplikacji i naprawdę nie wiem dlaczego.Jak odświeżyć ListView w Fragment wypełniony BaseAdapter?

Oto klas:

Jest to fragment z ListView na to, że chcę, aby odświeżyć, gdy okno jest zamknięte.

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(); 
    } 
} 

I to jest adapter wypełnić listę z:

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; 
    } 
} 

I to jest główna, która posiada wszystko razem:

gdy przycisk positv okna dialogowego zostanie naciśnięty, a następnie nowe Dane są dodawane do bazy danych, które chcę, aby aby zobaczyć na liścieView "be "dialog". Tak bardzo próbowałem, ale naprawdę tego nie rozumiem. Mam nadzieję, że możesz mi pomóc.

Dzięki :)

+0

To nie jest dobry pomysł, aby załadować dane w wątku UI. Zapoznaj się z CursorLoader (http://developer.android.com/reference/android/content/CursorLoader.html) lub niestandardowym AsyncTaskLoader. Aby po prostu rozwiązać problem, musisz utworzyć nową instancję adaptera i ustawić go na ListView – JustAnotherCoder

Odpowiedz

4

Można to zrobić

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

odświeżyć ListView lub przechowuje dane w pamięci z inną kartą.

EDIT: Przykro mi, że nie po raz pierwszy dobrze czytać Twoje pytanie, możesz napisać to w karty:

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

Tak, to działało dla mnie. Ale myślę, że nie jest to "najlepsza praktyka" do robienia tego. Czy wiesz, jak rozwiązać ten problem ładniej? W ten sposób mógłbym również wywołać metodę getActivity.findViewbyId (R.id.list), a następnie dodać nową kartę. Myślę, że to nie jest sposób w jaki to robisz. – wirthual

0

Spróbuj ListView.invalidateViews() content odświeżania

+0

Próbowałem list.invalidateViews zamiast adapter.notifyDataSetChanged(); ale to też nie zadziałało. " – wirthual

+0

Upewnij się, że dane zostały zmienione przed wywołaniem. Database.getAlltitles() - zwrócony wynik został zmieniony czy nie? – matreshkin

+0

Dziwne jest to, że po dodaniu pierwszego elementu i zamknięciu działania i uruchomieniu go ponownie, działa. Jestem bardzo zmieszany. – wirthual

Powiązane problemy