6

Bir İletişim Kutusu kapalı olduğunda, bir Parçada Liste Görünümü Yenile. Şimdiye kadar yenileme sadece uygulamayı yeniden başlattığımda ve nedenini bilmiyorum. i Dialog kapatıldığında, yenilemek istediğiniz,ListView, BasicAdapter ile dolu Fragment nasıl yenilir?

Bunun üzerinde ListView ile Fragment geçerli:

İşte sınıflardır.

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

Ve bu birlikte Listesini doldurmak Adaptör geçerli:

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

Ve bu her şeyi birlikte tutan Ana geçerli:

Dialog positv Düğme, daha sonra basıldığında Yeni Veri, Listede görmek için

public class MainActivity extends SherlockFragmentActivity implements OnRegisterCreatedListener { 
    RegisterListFragment registerListFragment; 
    HelpFragment helpFragment; 

    boolean helpVisible = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     // Grund-Layout für die Activity festlegen 
     setContentView(R.layout.act_select_main); 

     addFragments(); 

     supportInvalidateOptionsMenu(); 
     setLargeInLandscape(); 

    } 

// Was passiert wenn der Menüknopf gedrückt wird 

    // Inflate the menu; this adds items to the action bar if it is present. 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Zeigt nur die die nicht in Actionbar sind, kann aber eingestellt 
     // werden im XML-File 

     if (helpVisible) { 
      getSupportMenuInflater().inflate(
        R.menu.act_select_menu_help_visible, menu); 

     } else { 
      getSupportMenuInflater().inflate(
        R.menu.act_select_menu_registerlist_visible, menu); 
     } 

     return true; 
    } 

    // Was passiert wenn ein Menüpunkt ausgewählt wird 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
      // Das wenn der Knopf das Plus war 
      case R.id.menu_help: 
       changeFragment(); 
       // this.supportInvalidateOptionsMenu(); 
       break; 
      case android.R.id.home: 
       changeFragment(); 
       // this.supportInvalidateOptionsMenu(); 
       break; 
      case R.id.menu_add_register: 
       FragmentManager fm = getSupportFragmentManager(); 

       NewRegisterFragment dialog = new NewRegisterFragment(); 
       dialog.setRetainInstance(true); 
       dialog.show(fm, "fragment_name"); 
       break; 
      // Listenelement hinzufügen und dem Adapter sagen es hat sich was 
      // geändert, mach neu 

     } 
     return true; 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_BACK: 
       if (helpVisible = true) { 
        // changeFragment(); 
        helpVisible = false; 
        getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
        supportInvalidateOptionsMenu(); 

       } 
       break; 

     } 

     return super.onKeyDown(keyCode, event); 
    } 

    private void addFragments() { 

     // Zuerst versuchen Fragmente aus dem Layout zu laden 
     registerListFragment = (RegisterListFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.registerListFragment); 
     helpFragment = (HelpFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.HelpFragment); 

     // Wenn die Fragmente nicht im Layout sind, füge sie dynamisch hinzu 
     if (registerListFragment == null && helpFragment == null) { 

      FragmentTransaction ft = getSupportFragmentManager() 
        .beginTransaction(); 

      registerListFragment = new RegisterListFragment(); 

      helpFragment = new HelpFragment(); 

      ft.setCustomAnimations(android.R.anim.fade_in, 
        android.R.anim.fade_out, android.R.anim.fade_in, 
        android.R.anim.fade_out); 

      ft.add(R.id.Fragmentframe, registerListFragment); 
      ft.add(R.id.Fragmentframe, helpFragment); 
      ft.show(registerListFragment); 
      ft.hide(helpFragment); 
      ft.commit(); 

      // OnclickListener für Fragmentwechseln 

     } 

    } 

    private void changeFragment() { 

     // Fragmente austauschen 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     if (registerListFragment.isVisible()) { 
      ft.hide(registerListFragment); 
      ft.show(helpFragment); 

      helpVisible = true; 
      supportInvalidateOptionsMenu(); 

      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

      if (getSupportFragmentManager().findFragmentByTag(
        "RegisterListFragment") == null) { 
       ft.addToBackStack("RegisterListFragment"); 
      } 
     } else { 
      ft.hide(helpFragment); 

      helpVisible = false; 
      supportInvalidateOptionsMenu(); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(false); 

      fm.popBackStack(); 
     } 

     ft.commit(); 
    } 

    private void setLargeInLandscape() { 
     if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      findViewById(R.id.menu_help).setVisibility(View.GONE); 
     } 
     if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      findViewById(R.id.menu_help).setVisibility(View.GONE); 
     } 

    } 

    @Override 
    public void OnRegisterCreated() { 
     // TODO Auto-generated method stub 
     registerListFragment.refreshData(); 

    } 

istediğiniz Veritabanına eklenir diyalog Çok denedim ama gerçekten anlamadım. Umarım bana yardım edebilirsin.

Teşekkür :)

+0

O UI iş parçacığı verileri yüklemek için iyi bir fikir değil. CursorLoader (http://developer.android.com/reference/android/content/CursorLoader.html) veya özel AsyncTaskLoader'a bir göz atın. Sorununuzu çözmek için, bağdaştırıcınızın yeni örneğini oluşturmanız ve ListView – JustAnotherCoder

cevap

4

ListView yenilemek veya farklı bir adaptör ile hafızada verileri tutmak için bu

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

yapabilirsiniz.

DÜZENLEME: Üzgünüm Sorunuzun ilk seferinde okumadım, sen adaptörü bu yazabilirsiniz:

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

Evet'i görüntülemeye ayarlayın. Ama bence bu, bunun için “en iyi uygulama” değil. Bu problemi nasıl çözeceğimi biliyor musun? Bu şekilde getActivity.findViewbyId (R.id.list) 'i de arayabilir ve sonra da yeni bir adaptör ekleyebilirim. Bence bunu yapmanın yolu bu değil. – wirthual

0

deneyin ListView.invalidateViews() yenileme içeriği

+0

olarak ayarlamanız gerekir. Adapter.notifyDataSetChanged(); ama aynı zamanda çalışmadı. - '' – wirthual

+0

Aramadan önce verilerin değiştiğine dikkat edin. Database.getAlltitles() - herhangi bir zamanda sonuç döndürülür mi? – matreshkin

+0

Garip olan şey, ilk madde eklendiğinde ve aktiviteyi kapatıp tekrar başladığımda, o zaman çalışır. Gerçekten kafam karıştı. – wirthual