0

CursorAdapter를 사용하는 ListActivity가 있는데 새로 고칠 수 없습니다. ContactDetailsActivity 내부의 방법은 내가 전화 refreshListView()라고 내가 한ListActivity with CursorAdapter에서 ListView 새로 고침

public class ContactDetailsCursorAdapter extends CursorAdapter 

:

public class ContactDetailsActivity extends ListActivity 
{ 

    private ContactDetailsBroadcastReceiver mLvBroadcastReceiver; 
    private Contact contact; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 


     contact = (Contact)getIntent().getSerializableExtra(AwesomeApp.CONTACT_OBJECT); 

     if(contact == null) { 
      DataUtils.log("Starting ContactDetailsActivity with NULL contact."); 
      Toast.makeText(this, getString(R.string.no_contact_selected), Toast.LENGTH_SHORT).show(); 
      finish(); 
      return; 
     } 

     DataUtils.log("Starting ContactDetailsActivity with contact:" + contact.toString()); 
     setTitle(contact.getName()); 

     Cursor cursor = getContactDetailsCursor(); 
     startManagingCursor(cursor); 

     setListAdapter(new ContactDetailsCursorAdapter(this, cursor)); 

     ListView lv = getListView(); 
     lv.setBackgroundResource(R.color.white); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       Toast.makeText(ContactDetailsActivity.this, "touched", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     //Create broadcast receiver, to detect when a file upload has finished so we can update the pic status. 
     mLvBroadcastReceiver = new ContactDetailsBroadcastReceiver(); 
    } 

    private class ContactDetailsBroadcastReceiver extends BroadcastReceiver 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      DataUtils.log("In BroadcastReceiver - ContactDetails"); 
      refreshListView(); 
     } 
    } 

내 어댑터가 기본적으로 그냥 CursorAdapter를 확장 내가 newViewbindView을 무시하는 : 여기에 내가 사용하고 코드의 일부입니다 onResume()onReceive() 내 BroadcastReceiver 방법

이 내 getContactDetailsCursor() 방법 : 당신이 볼 수 있듯이, 나는 notifyDataSetChanged(), invalidate(), invalidateViews()을 시도하고 아무것도 목록보기를 새로 것 같다

private Cursor getContactDetailsCursor() 
{ 
    AwesomeDbAdapter dbAdapter = AwesomeApp.getDbAdapter(this); 
    Cursor c = dbAdapter.getRecentConversationsFromContact(contact.getId()); 
    DataUtils.log("New ContactDetails cursor has " + c.getCount() + " elements"); 
    return c; 
} 

.

새로 고침하는 방법에 대한 아이디어가 완전히 없습니다. 로그를보고 있는데이 메서드는 onResume()과 BroadcastReceiver의 onReceive() 메서드에서 호출됩니다.

모든 포인터가 높이 평가됩니다!

답변

0

수신자를 등록하는 것을 잊어 버린 것 같습니다. 수신자를 등록하지 않고 등록하려면 등록자를 등록하지 말고 아래 수신기를 등록하십시오.

예 : 하지 OnCreate :들의 OnDestroy에서

ContactDetailsBroadcastReceiver receiver=new ContactDetailsBroadcastReceiver(); 
IntentFilter filter=new IntentFilter("android.net.wifi.STATE_CHANGE") 
registerReceiver(receiver, filter); 

:

unregisterReceiver(receiver); 
+0

실제로는 onReceive() 메소드가 호출되고 refreshListView()가 호출되면 로그 메시지가 표시됩니다. 그러나 listview는 동일하게 유지됩니다. 이 코드는 명확성을 위해 위에 포함되지 않았지만 이는 언급되어 있습니다. – Sandy

0

startManagingCursor (커서);

그것은 커서 작업 방법을 사용되지 않습니다, 당신은 자동으로

+0

네, 저는 이것을 알고 있습니다, 그러나 이것이 어떻게 이루어져야하는지입니다. – Sandy

+0

이 외에도 내 데이터는 내 애플리케이션에서만 사용되며 http://stackoverflow.com/questions/18326954/how-to-read-an-sqlite-db-in-android-witha-a- 커서를 사용하면 Loader가 ContentProvider 데이터에 더 적합하고 이러한 방식으로 제공되지 않는 다른 데이터에는 적합하지 않은 것으로 보입니다. – Sandy

+0

로더는 데이터를 사용하여 비동기 로딩 커서에 대한 솔루션입니다 (예 : SQL을 사용하여 ContentProvider를 사용했는지 여부와 관계없이 –

1

이 결국 나를 위해 일한 것입니다 데이터를 다시로드 할 수있는 Loaders를 사용합니다. @Kirill Shalnov에 의해 언급 되었 듯이, startManagingCursor()은 사용되지 않지만 더 이상 사용하지 않아도됩니다. 솔직히 말해서 그것은 약간의 추측이지만, 슬프게도 내가 필요한 것을합니다.