2012-02-29 1 views
1

私はdata from Sqlite DB and applying to listviewを取得しています。私はサービスクラスからデータを挿入しています。私のサービスクラスでは、私はWEBサービスからデータを取得し、最新のSqliteを挿入していますモバイル・データベースこのサービス・クラスは5秒ごとに実行され、最新のWebサービスをチェックしてからSqlite dbに挿入します。新しいレコードがSqlite DBに挿入されると、リストビューは最新の挿入レコードで更新されません。私のアプリケーションは、次のように:SimpleCursorAdapterリストビューをサービスクラスから更新するにはどうすればよいですか?

MyActivity.java

private MySqliteHelper msh; 
ListView lst; 
Cursor cursor; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     msh = new MySqliteHelper(MyActivity.this); 
     msh.openToWrite(); 
     lst = ((ListView)findViewById(R.id.listView1)); 
     cursor = msh.queueAll(); 

     String getFromDB[] = new String[]{MySqliteHelper.KEY_CONTENT1,MySqliteHelper.KEY_CONTENT2}; 
     int toView[] = new int[]{R.id.msgId,R.id.usrmsg}; 

     lst.setAdapter(new SimpleCursorAdapter(this, R.layout.list, cursor, getFromDB, toView)); 

     //calling service class 
     bindService(new Intent(ShoutGetMessagesActivity.this, ShoutRepeatService.class), mConnection, Context.BIND_AUTO_CREATE); 

     updateList(); 
    } 

     private void updateList(){ 
       cursor.requery(); 
       } 


     RepeatService bg; 
     private ServiceConnection mConnection = new ServiceConnection() { 

      public void onServiceConnected(ComponentName className, IBinder binder) { 

       bg = ((RepeatService.MyBinder) binder).getService(); 

       Toast.makeText(MyActivity.this, "Connected", 
         Toast.LENGTH_SHORT).show(); 

      } 

      public void onServiceDisconnected(ComponentName className) { 
       bg = null; 
      } 
     }; 
    } 

私は、最新のレコードを取得したSQLiteのDBに挿入しています上記のサービスクラスからRepeatService.java

ArrayList<NewMessages> result; 
    private MySqliteHelper msh; 

    private Timer timer = new Timer(); 
    private static final long UPDATE_INTERVAL = 500; 



    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
      msh = new MySqliteHelper(this); 
      msh.openToWrite(); 

     pollForUpdates(); 

    super.onCreate(); 
    } 

     private void pollForUpdates() { 
     timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       Log.v("Last message ID", "====>"+MySqliteHelper.LastMsgID); 

       if(MySqliteHelper.LastMsgID==null){ 

        MySqliteHelper.LastMsgID="0"; 

       } 

       result = new ParseXml().convertUsersDetails(new Generic().getLatestFromWebService(MySqliteHelper.LastMsgID)); 


       for(int i=0;i<result.size();i++){ 
        String msgs =result.get(i).getMessages(); 
        String msgID = result.get(i).getMsgId(); 
         Log.v("messages", "------------>>>>"+msgs); 
         Log.v("messageIDs", "--------->>>>>>"+msgID); 
         msh.insert(msgID, msgs); 
        } 

      } 
     }, 0, UPDATE_INTERVAL); 

     Log.v(getClass().getSimpleName(), "Timer started."); 

    } 



     private void updateList(){ 
     cursor.requery(); 
     } 

    public class MyBinder extends Binder { 
     RepeatService getService() 
     { 
      return RepeatService.this; 
     } 
    } 
} 

。 このサービスクラスからViewクラスに更新するにはどうすればよいですか?

すべてのボディは、データが更新されるたびに

答えて

5

あなたがサービス

private void pollForUpdates() { 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     Log.v("Last message ID", "====>"+MySqliteHelper.LastMsgID); 

     if(MySqliteHelper.LastMsgID==null){ 

      MySqliteHelper.LastMsgID="0"; 

     } 

     result = new ParseXml().convertUsersDetails(new Generic().getLatestFromWebService(MySqliteHelper.LastMsgID)); 


     for(int i=0;i<result.size();i++){ 
      String msgs =result.get(i).getMessages(); 
      String msgID = result.get(i).getMsgId(); 
       Log.v("messages", "------------>>>>"+msgs); 
       Log.v("messageIDs", "--------->>>>>>"+msgID); 
       msh.insert(msgID, msgs); 
      } 

    } 
************************************* 
Intent intent = new Intent(); 
intent.setAction("com.example.updatelist"); 
sendBroadcast(intent); // finally broadcast 
************************************* 

}, 0, UPDATE_INTERVAL); 

Log.v(getClass().getSimpleName(), "Timer started."); 

} 

のrun()メソッドからの活動で関数を呼び出すための意図を使用して放送を作成することができ、あなたの活動にあなたが放送の意図を受け取り、リスト

を更新する必要があります
// Register Broadcast Receiver to receive broadcast intent in oncreate method 

public oncreate() 
{  
IntentFilter filter = new IntentFilter("com.example.updatelist"); 
     registerReceiver(myReceiver, filter); 
} 

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

    msh = new MySqliteHelper(MyActivity.this); 
    msh.openToWrite(); 
    lst = ((ListView)findViewById(R.id.listView1)); 
    cursor = msh.queueAll(); 

    String getFromDB[] = new String[] MySqliteHelper.KEY_CONTENT1,MySqliteHelper.KEY_CONTENT2}; 
    int toView[] = new int[]{R.id.msgId,R.id.usrmsg}; 

    lst.setAdapter(new SimpleCursorAdapter(this, R.layout.list, cursor, getFromDB, toView)); 

    } 
}; 
+0

URの回答に感謝しますが、latesレコードは最後のposition.isに最初の位置にlatesレコードを追加するチャンスが追加されていますか? –

1

あなたが活動に放送受信機を使用して、サービスを持つことができますが、放送を発する私を助けてください。そして、これを動作させるためにカスタム放送を定義する必要があります。

まず、データがサービスで変更された場合 が行う、この

public static final String DATA_INSERTED = "WHATEVER_YOU_WANT" 

のようなカスタムアクションを定義して、この特定のDATA_INSERTEDアクションに耳を傾け、カスタム放送受信機を初期化

Intent intent = new Intent (DATA_INSERTED); 
sendBroadcast(intent) 

。 onReceiveメソッドをオーバーライドします。 onReceiveメソッドで。アダプタでnotifydatasetchangedを呼び出す必要があります。これは、simplecursoradapterへの参照が必要であることを意味します。私は、あなたが把握するために放送受信機の実装を残します。

+0

私はいくつかのコードの説明を与えることができます –

+0

私は応答を編集しました。 – CChi

関連する問題