2012-02-11 10 views
0

Dudes、AndroidウィジェットはDBから1つのアイテムのみを表示します

私のAndroidウィジェットはデータベースから1レコードしか表示しません。私は、複数のアイテムがデータベースから取得されていると確信しています。

WidgetProviderさんにonUpdate方法:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    if (items == null) { 
     items = new ItemsData(new DbHelper(context)); 
    } 

    final int N = appWidgetIds.length; 

    Item[] iii = items.getItemsArray(); 
    Log.d(TAG, "got " + iii.length + " items from db"); 

    ComponentName thisWidget = new ComponentName(context, WidgetProvider.class); 

    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     Log.d(TAG, "updating widget " + appWidgetId); 

     RemoteViews rv = new RemoteViews(context.getPackageName(), 
       R.layout.widgetlayout); 

     for (Item item : iii) { 

      Log.d(TAG, "updating item " + item.id + ", " + item.title); 

      RemoteViews views = new RemoteViews(context.getPackageName(), 
        R.layout.row); 
      views.setTextViewText(R.id.textViewShortName, item.title); 
      views.setTextViewText(R.id.textViewDesc, item.description); 
      views.setTextViewText(R.id.textViewDue, new StringBuilder() 
        .append(item.dueDate).toString()); 
      rv.addView(R.id.llWidget, views); 
     } 

     appWidgetManager.updateAppWidget(thisWidget, rv); 

    } 

} 

そして、私のレイアウトはちょうどである:私のニーズに配置された3つのTextViewアイテムを、という '行' と

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/llWidget" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#ff99ff"> 

    <include 
     android:id="@+id/row" 
     layout="@layout/row" /> 

</LinearLayout> 

これは何ですか:DBとウィジェットのアップデートにアイテムを追加すると、最後のアイテム だけが表示されます。それは上に置かれます。

私はアンドロイドウィジェットガイド、スタックオーバーフロー、他のウェブサイト、チュートリアルを本から検索しましたが、いくつかは類似の例を提示していますが、私はそれを働かせることはできません... Google Androidウィジェットガイドショーコレクションの使用方法は、3.0以上の場合のみです。 Androidブックでは要素が行として追加されたウィジェットが記述されているため、私はそれに従っていますが、進捗ができませんでした... ウィジェット内からdbからデータを取得することについて人々から尋ねられました(例えばAndroid: get Widget Data from database)そのような問題に遭遇していなかった。彼らのソリューションは私のためには機能しません。

今私はエラーを探す方法がわかりません... LogCatで奇妙なことに、「アイテムXを更新しています」という行が見えます。

アイデア?

UPDATE 1. 更新方法セルゲイ・ベナーの情報の後に(関連部分):

Item[] iii = items.getItemsArray(); 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 
     RemoteViews rv = new RemoteViews(context.getPackageName(), 
       R.layout.widgetlayout); 
     for (Item item : iii) { 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
        R.layout.row); 
      views.setTextViewText(R.id.textViewShortName, item.title); 
      views.setTextViewText(R.id.textViewDesc, item.description); 
      views.setTextViewText(R.id.textViewDue, new StringBuilder() 
        .append(item.dueDate).toString()); 
      rv.addView(R.id.llWidget, views); 
     } 

     appWidgetManager.updateAppWidget(appWidgetId, rv); 
    } 

UPDATE 2.

AndroidManifestファイル:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.whatnot.todoex" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:debuggable="true" 
     android:name=".ToDoExApp" > 

     <activity 
      android:label="@string/app_name" 
      android:name=".ListItemsActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <activity android:label="@string/titleAdd" android:name=".AddItemActivity" /> 

     <activity android:label="@string/titleRemindments" android:name=".RemindmentListActivity" /> 

     <activity android:label="@string/titleAddRemindment" android:name=".AddRemindmentActivity" /> 

     <activity android:label="@string/titleSetDate" android:name=".ChooseDateActivity" /> 

     <receiver android:name=".WidgetProvider" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" 
        android:resource="@xml/widgetprovider" /> 
     </receiver> 

    </application> 

</manifest> 

widgetprovider.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="160dp" 
    android:updatePeriodMillis="3000" 

    android:initialLayout="@layout/widgetlayout" > 

</appwidget-provider> 

row.xml:この記事の冒頭に

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textViewShortName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/textViewDesc" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="0.80" 
      android:textAppearance="?android:attr/textAppearanceSmall" /> 

     <TextView 
      android:id="@+id/textViewDue" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="right" 
      android:textAppearance="?android:attr/textAppearanceSmall" /> 
    </LinearLayout> 

</LinearLayout> 

と更新にonUpdate方法。 WidgetProviderにはそれほど多くはありません。空のコンストラクタ、on.enEnabledだけのonEnabled .. また、ウィジェットレイアウト全体とxml行を配置しました。

更新3。 は今、アイテムが変更されるたびに、私はこの方法を実行します。

public void onReceive(Context context, Intent intent) { 

    if (intent.getAction().equals(UPDATE)) { 
     Log.d(TAG, "onReceived detected new update"); 
     AppWidgetManager appWidgetManager = AppWidgetManager 
       .getInstance(context); // 13 
     this.onUpdate(context, appWidgetManager, appWidgetManager 
       .getAppWidgetIds(new ComponentName(context, 
         WidgetProvider.class)), 
       intent.getExtras().getLong(WidgetProvider.UPDATE_ITEM)); 
    } else { 
     super.onReceive(context, intent); 
    } 
} 

とにonUpdateの特別な、修正されたバージョンは、このようなものです::

private void updateWidget(Item item) { 
    Log.d(TAG, "updateWidget(). Sending broadcast to widget."); 

    Intent intent = new Intent(WidgetProvider.UPDATE); 
    intent.putExtra(WidgetProvider.UPDATE_ITEM, item.id); 
    sendBroadcast(intent); 
} 

マイウィジェットのonReceivedは次のようになります

私が変更するたびに、データベースにアイテムを追加すると、その情報がウィジェットにブロードキャストされます。その後、受信され、処理されます。ただし、この項目のみがウィジェットに表示されます。 AndroidアプリからのYambaアプリケーションには、非常によく似たものがあります。アップデートが見つかるたびに、ウィジェットに追加されています。私が見る唯一の重大な違いは、ヤンバは、コンテンツリゾルバを使用していることであると私は、データベースを使用して...

答えて

0

私はサンプルとしてとしての私のウィジェットに項目を追加するには、以下の使用:この基本的

for(Server srv:mylist){ 
     newView = new RemoteViews(context.getPackageName(), R.layout.widget_row); 
     newView.setTextViewText(R.id.servername,srv.getServerName()); 
     newView.setTextViewText(R.id.serverstatus,srv.getServerStatus()); 
     remoteViews.addView(R.id.widget,newView); 
    } 

」を追加remoteViews

編集する行」newView

は2.2でウィジェットを実行します。ウィジェットはもちろん、 ランチャーに応じて伸ばすことができます。

EDIT:

試してみるとにonUpdate()で次の を使用


ComponentName thisWidget = new ComponentName(context, MyWidget.class); 
    Item[] iii = items.getItemsArray(); 
    RemoteViews rv = new RemoteViews(context.getPackageName(), 
      R.layout.widgetlayout); 
    for (Item item : iii) { 
     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.row); 
     views.setTextViewText(R.id.textViewShortName, item.title); 
     views.setTextViewText(R.id.textViewDesc, item.description); 
     views.setTextViewText(R.id.textViewDue, new StringBuilder() 
       .append(item.dueDate).toString()); 
     rv.addView(R.id.llWidget, views); 
    } 

    appWidgetManager.updateAppWidget(thisWidget, rv); 
私はまだこの

 for (int i = 0; i < N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

実施例ではポイントは何を理解していけない

: まだサービスを実装したいかもしれません


public class StatusWidget extends AppWidgetProvider { 
    LayoutInflater inflater; 
    int[] appWidgetIds; 
    AppWidgetManager appWidgetManager; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) { 
     this.appWidgetIds=appWidgetIds; 
     this.appWidgetManager=appWidgetManager; 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 30000); //30 seconds timeout 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
      final int appWidgetId = intent.getExtras().getInt(
           AppWidgetManager.EXTRA_APPWIDGET_ID, 
           AppWidgetManager.INVALID_APPWIDGET_ID); 

      if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
       this.onDeleted(context, new int[]{appWidgetId}); 
      } 
     } else { 
      super.onReceive(context, intent); 
     } 
    } 

    private class MyTime extends TimerTask { 
     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 
     Context context; 
     public MyTime(Context context, AppWidgetManager appWidgetManager) { 
      this.context = context; 
      this.appWidgetManager = appWidgetManager; 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_message); 
      thisWidget = new ComponentName(context, StatusWidget.class); 
     } 

     @Override 
     public void run() { 
      remoteViews.removeAllViews(R.id.widget); 
      Date date = new Date(); 
      DateFormat format = SimpleDateFormat.getTimeInstance(
      SimpleDateFormat.LONG, Locale.getDefault());   
      InputStream is = null; 
      ImageAdapter myServers =null; 
       List<Server> mylist =null; 
      try { 
       is = new ByteArrayInputStream(Utils.fetch("http://mystatusserver/status", null).toByteArray()); 
      } catch (Exception cte) { 
      } 

      try { 
       String l = Utils.readInputStream(is); 
      List<Server> list= Utils.parseServers(l); 
      mylist= Utils.loadMyServerList(context, list); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      RemoteViews newView =null; 
      for(Server srv:mylist){ 
       newView = new RemoteViews(context.getPackageName(), R.layout.widget_row); 
       newView.setTextViewText(R.id.servername,srv.getServerName()); 
       newView.setTextViewText(R.id.serverstatus,srv.getServerStatus()); 
       remoteViews.addView(R.id.widget,newView); 
      } 
      newView = new RemoteViews(context.getPackageName(), R.layout.datetime); 
      newView.setTextViewText(R.id.time,"Last Updated At: "+format.format(date)); 
      remoteViews.addView(R.id.widget,newView); 
      appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

     } 
    } 

} 

それはしかし、私はもはやウィジェット上で任意の項目を見ることができない何らかの理由でABIT

+0

おかげで、助けを願っています。ウィジェットは空白です。私のウィジェットのレイアウトは、 'include行'を持つLinearLayoutです。そして私はAndroid 2.2用に開発しています。 – Genkaku

+0

最新のコードを表示してください。 –

+0

あなたの質問にそれを入れてください。読むことは不可能です。 –

関連する問題