1

Я работаю над приложением, в котором я использую фоновое обслуживание для отправки запроса на сервер, тогда ответ сохраняется в базе данных и динамически отображает данные, получая ответы от служба фона и сохранение их в базе данных, зная, что я используюобновить активность после получения ответа от фоновой службы

ListView

для отображения данных из базы данных. как я могу обновлять активность каждый раз, когда я сохраняю новые данные в базе данных? У меня есть triyed отображение данных после щелчка, он работает, как я могу сделать это динамически?

+0

Вы можете сделать это с помощью метода ListView Notifydatasetchanged – Hardy

+0

@Hardipatel я использовал Notifydatasetchanged но в OnClick, но в динамическом отображении я не уверен, где использовать его и как чтобы использовать его, можете ли вы, пожалуйста, помогите мне поблагодарить вас – Adams

+0

Попробуйте использовать AsyncTask для получения данных из сети и хранения БД и уведомить ListView onPostExecute после того, как данные вставлены в БД: http://developer.android.com/reference/android/os/ AsyncTask.html –

ответ

3

Предполагая, что вы используете верную службу или нет AsyncTask.

Используйте шаблон BroadcastReceiver. Отправьте вещание в свою службу.

LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("data_changed")); 

Объявить приемник в деятельности, содержащий ваш ListView

private BroadcastReceiver dataChangeReceiver= new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // update your listview 
    } 
}; 

Регистрация и разрегистрировать это

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter inF = new IntentFilter("data_changed"); 
    LocalBroadcastManager.getInstance(this).registerReceiver(dataChangeReceiver,inF); 



} 
@Override 
protected void onPause() { 
    super.onPause(); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(dataChangeReceiver); 
} 
2

Пробег: CursorLoader. Loader контролирует источник данных и приносит новые результаты при изменении контента.

Пример из official reference

Здесь полное осуществление фрагмента, который отображает ListView , содержащие результаты запроса к контактам содержимого поставщика. Он использует CursorLoader для управления запросом на провайдере

public static class CursorLoaderListFragment extends ListFragment 
     implements OnQueryTextListener, OnCloseListener, 
     LoaderManager.LoaderCallbacks<Cursor> { 

    // This is the Adapter being used to display the list's data. 
    SimpleCursorAdapter mAdapter; 

    // The SearchView for doing filtering. 
    SearchView mSearchView; 

    // If non-null, this is the current filter the user has provided. 
    String mCurFilter; 

    @Override public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Give some text to display if there is no data. In a real 
     // application this would come from a resource. 
     setEmptyText("No phone numbers"); 

     // We have a menu item to show in action bar. 
     setHasOptionsMenu(true); 

     // Create an empty adapter we will use to display the loaded data. 
     mAdapter = new SimpleCursorAdapter(getActivity(), 
       android.R.layout.simple_list_item_2, null, 
       new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, 
       new int[] { android.R.id.text1, android.R.id.text2 }, 0); 
     setListAdapter(mAdapter); 

     // Start out with a progress indicator. 
     setListShown(false); 

     // Prepare the loader. Either re-connect with an existing one, 
     // or start a new one. 
     getLoaderManager().initLoader(0, null, this); 
    } 

    public static class MySearchView extends SearchView { 
     public MySearchView(Context context) { 
      super(context); 
     } 

     // The normal SearchView doesn't clear its search text when 
     // collapsed, so we will do this for it. 
     @Override 
     public void onActionViewCollapsed() { 
      setQuery("", false); 
      super.onActionViewCollapsed(); 
     } 
    } 

    @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Place an action bar item for searching. 
     MenuItem item = menu.add("Search"); 
     item.setIcon(android.R.drawable.ic_menu_search); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM 
       | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
     mSearchView = new MySearchView(getActivity()); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setOnCloseListener(this); 
     mSearchView.setIconifiedByDefault(true); 
     item.setActionView(mSearchView); 
    } 

    public boolean onQueryTextChange(String newText) { 
     // Called when the action bar search text has changed. Update 
     // the search filter, and restart the loader to do a new query 
     // with this filter. 
     String newFilter = !TextUtils.isEmpty(newText) ? newText : null; 
     // Don't do anything if the filter hasn't actually changed. 
     // Prevents restarting the loader when restoring state. 
     if (mCurFilter == null && newFilter == null) { 
      return true; 
     } 
     if (mCurFilter != null && mCurFilter.equals(newFilter)) { 
      return true; 
     } 
     mCurFilter = newFilter; 
     getLoaderManager().restartLoader(0, null, this); 
     return true; 
    } 

    @Override public boolean onQueryTextSubmit(String query) { 
     // Don't care about this. 
     return true; 
    } 

    @Override 
    public boolean onClose() { 
     if (!TextUtils.isEmpty(mSearchView.getQuery())) { 
      mSearchView.setQuery(null, true); 
     } 
     return true; 
    } 

    @Override public void onListItemClick(ListView l, View v, int position, long id) { 
     // Insert desired behavior here. 
     Log.i("FragmentComplexList", "Item clicked: " + id); 
    } 

    // These are the Contacts rows that we will retrieve. 
    static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 
     Contacts._ID, 
     Contacts.DISPLAY_NAME, 
     Contacts.CONTACT_STATUS, 
     Contacts.CONTACT_PRESENCE, 
     Contacts.PHOTO_ID, 
     Contacts.LOOKUP_KEY, 
    }; 

    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     // This is called when a new Loader needs to be created. This 
     // sample only has one Loader, so we don't care about the ID. 
     // First, pick the base URI to use depending on whether we are 
     // currently filtering. 
     Uri baseUri; 
     if (mCurFilter != null) { 
      baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
        Uri.encode(mCurFilter)); 
     } else { 
      baseUri = Contacts.CONTENT_URI; 
     } 

     // Now create and return a CursorLoader that will take care of 
     // creating a Cursor for the data being displayed. 
     String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
       + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 
       + Contacts.DISPLAY_NAME + " != ''))"; 
     return new CursorLoader(getActivity(), baseUri, 
       CONTACTS_SUMMARY_PROJECTION, select, null, 
       Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
    } 

    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     // Swap the new cursor in. (The framework will take care of closing the 
     // old cursor once we return.) 
     mAdapter.swapCursor(data); 

     // The list should now be shown. 
     if (isResumed()) { 
      setListShown(true); 
     } else { 
      setListShownNoAnimation(true); 
     } 
    } 

    public void onLoaderReset(Loader<Cursor> loader) { 
     // This is called when the last Cursor provided to onLoadFinished() 
     // above is about to be closed. We need to make sure we are no 
     // longer using it. 
     mAdapter.swapCursor(null); 
    } 
} 
+0

Добро пожаловать в Stack Overflow! Просьба указать наиболее релевантную часть ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. См. [Как написать хороший ответ] (http://stackoverflow.com/help/how-to-answer). – ByteHamster

1
You can refresh the data of activity by using Broadcast receiver. To update 
the view in UI you can go for .invalidate() in the view which you want to refresh. For Example 
    RelativeLayout slidingUpLayout=(RelativeLayout) view.findViewById(R.id.slidingLayout); 
    slidingUpLayout.invalidate(); 

Now Безотносительно компоненты, такие как кнопки, ImageView и т.д. ... внутри этого relativelayout будет перерисован для обновления последних обновлений. Посмотрите @ эту Related ques, How android draws, Invalidate(), requestLayout()

Смежные вопросы