2015-03-06 2 views
0

У меня есть список адресов Android. В основном он будет отображать информацию пользователя на экране. Пожалуйста, помогите мне объяснить, как listView устанавливает данные. Как SimpleCursorAdapter связи с LoaderAndroid SimpleCursorAdapter и CursorLoader

Вот код:

public class ChatList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>{ 

    private SimpleCursorAdapter adapter; 
    private final int Adapter_AccountName = 1; 
    @SuppressLint("NewApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chatlist); 

     adapter = new SimpleCursorAdapter(this, 
       R.layout.main_list_item, 
       null, 
       new String[]{DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE}, 
       new int[]{R.id.text1, R.id.text2,R.id.text3,R.id.avatar}, 
       0); 

     adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 

      @Override 
      public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
       switch(view.getId()) { 
       // here can add one more line in the main page for each account 
       case R.id.text2: 
        int count = cursor.getInt(columnIndex); 
        if (count > 0) { 
         ((TextView)view).setText(String.format("%d new message%s", count, count==1 ? "" : "s")); 
        } 
        return true;  
       case R.id.text3: 
        String lastUpdate = cursor.getString(columnIndex); 
        Date d = DbDatetimeUtility.getDate(cursor.getString(columnIndex)); 
        Date t = DbDatetimeUtility.getCurrentDate(); 
        ((TextView)view).setText(DbDatetimeUtility.returnDifferentTime(d,t)); 
        return true;  
       case R.id.avatar: 
        byte[] imageByte = cursor.getBlob(columnIndex); 
        ((ImageView)view).setImageBitmap(DbBitmapUtility.getResizedBitmap(DbBitmapUtility.getImage(imageByte),125,125)); 
        return true; 
       } 
       return false; 
      } 
     }); 

     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(false); 

     //final ListView listView = getListView(); 
     final ListView listView = getListView(); 

     listView.setAdapter(adapter); 

     getLoaderManager().initLoader(0, null, this); 

    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

     case R.id.action_settings: 
      Intent intent = new Intent(this, SettingsActivity.class); 
      startActivity(intent); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Intent intent = new Intent(this, ChatActivity.class); 
     intent.putExtra(Common.PROFILE_ID, String.valueOf(id)); 
     startActivity(intent); 
    } 

    //---------------------------------------------------------------------------- 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     CursorLoader loader = new CursorLoader(this, 
       DataProvider.CONTENT_URI_PROFILE, 
       new String[]{DataProvider.COL_ID, DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE}, 
       null, 
       null,//new String[]{DataProvider.PROFILE_COL_LASTMSGAT}, 
       DataProvider.PROFILE_COL_LASTMSGAT + " DESC"); 
     return loader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     adapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     adapter.swapCursor(null); 
    } 

} 

Заранее спасибо!

ответ

1

Кратко сейчас, основные моменты:

  1. onCreateLoader получает данные из базы данных SQLite.
  2. Этот код adapter = new SimpleCursorAdapter, заполняет адаптер.
  3. Этот код listView.setAdapter(adapter); заполняет ListView.

Существует хороший Stackoverflow ответ на Using SimpleCursorAdapter to get Data from Database to ListView

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