6

Tôi muốn làm mới một ListView trong một Fragment khi một Dialog được đóng lại. Cho đến bây giờ, tính năng làm mới chỉ hoạt động khi tôi khởi động lại ứng dụng và tôi thực sự không biết tại sao.Làm thế nào để làm mới ListView trong Fragment được làm đầy với BaseAdapter?

Dưới đây là các lớp:

Đây là Fragment với ListView vào nó, mà tôi muốn làm mới, khi Dialog được đóng lại.

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

Và đây là Adaptor tôi điền vào danh sách với:

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

Và đây là chính chứa tất cả mọi thứ với nhau:

Khi nút positv của Dialog được nhấn, sau đó Dữ liệu mới được thêm vào Cơ sở dữ liệu mà tôi muốn

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

    } 

để xem trong danh sáchXem " liên kết "hộp thoại". Tôi đã cố gắng rất nhiều, nhưng tôi thực sự đã không nhận được nó. Hy vọng bạn có thể giúp tôi.

Cảm ơn :)

+0

Đó không phải là ý tưởng tốt để tải dữ liệu trong thread UI. Hãy xem CursorLoader (http://developer.android.com/reference/android/content/CursorLoader.html) hoặc AsyncTaskLoader tùy chỉnh. Để đơn giản giải quyết vấn đề của bạn, bạn cần phải tạo ra thể hiện mới của bộ điều hợp của bạn và đặt nó vào ListView – JustAnotherCoder

Trả lời

4

Bạn có thể làm điều này

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

để làm mới ListView hoặc giữ các dữ liệu trong bộ nhớ với một bộ chuyển đổi khác nhau.

EDIT: Xin lỗi tôi đã không đọc câu hỏi của bạn cũng là lần đầu tiên, bạn có thể viết những dòng này trong bộ chuyển đổi của bạn:

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

Vâng, điều đó làm việc cho tôi. Nhưng tôi nghĩ đây không phải là "thực hành tốt nhất" để làm điều này. Bạn có biết cách giải quyết vấn đề này đẹp hơn không? Bởi vì cách này tôi cũng có thể gọi getActivity.findViewbyId (R.id.list) và sau đó thêm một bộ điều hợp mới. Tôi nghĩ rằng đây không phải là cách bạn làm điều này. – wirthual

0

Hãy thử ListView.invalidateViews() làm mới nội dung

+0

Tôi đã thử list.invalidateViews thay vì adapter.notifyDataSetChanged(); nhưng nó cũng không hoạt động --.- ' – wirthual

+0

Hãy chắc chắn rằng dữ liệu của bạn đã thay đổi trước khi gọi. Database.getAlltitles() - là kết quả trả về được thay đổi khi nào? – matreshkin

+0

Điều kỳ lạ là khi Item đầu tiên được thêm vào và tôi đóng Activity lại và khởi động lại nó, sau đó nó hoạt động. Tôi thực sự bối rối. – wirthual