2012-02-11 58 views
0

Dudes,Android小部件只顯示數據庫中的一項產品

我的Android小部件只顯示一條來自我的數據庫的記錄。我確信從數據庫中檢索到多個項目。

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); 

    } 

} 

而且我的佈局就是:

<?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> 

與 '行' 三分TextView的項目,安排我的需求。

會發生什麼情況是這樣的:當我將項目添加到數據庫和Widget更新,只有最後一項 可以看出。它被放置在頂部。

我搜索Android小工具指南,堆棧溢出,其他一些網站,教程從一本書,但即使一些已經提出類似的例子,我無法得到它的工作... 谷歌Android窗口小部件指南節目如何使用集合,但它只適用於3.0+。 學習Android的書描述了加入行的元素一個小部件,所以我跟着它 - 但無法取得任何進展...... 人們被問及小部件中從數據庫獲取數據,據我所知,(如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其他東西:一個空的構造,只有super.onEnabled onEnabled .. 另外:我已經把整個小部件佈局和行個XML。

UPDATE 3。現在 ,每次一個項目是改變了我運行此方法:

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看起來像現在這樣:

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的一種特殊的,修改後的版本是這樣的:

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

    if (items == null) { 
     items = ((ToDoExApp) ((ContextWrapper) context).getBaseContext()).itemsData; 
    } 

    Item item = items.getItem2(itemId); 
    if (item == null) { 
     Log.d(TAG, "Item with id = " + itemId + " not found."); 
     return; 
    } 

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

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

     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()); 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

} 

現在,無論何時更改,向數據庫添加項目,都會將相關信息廣播到小部件。然後它被接收並處理。但是,只有這個項目顯示在小部件上。 Yamba應用程序(來自Learning Android)有一些非常相似的東西 - 每次找到更新時,都會將其添加到窗口小部件。唯一的嚴重分歧,我看到的是,揚巴使用內容解析器和我使用的數據庫...

回答

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); 
    } 

這基本上增加了一個「排」 newViewremoteViews

編輯:

在2.2運行部件。當然,這個小部件可以根據你的 發射器來拉伸。

編輯:

嘗試使用以下 中的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); 

     } 
    } 

} 

希望它可以幫助升技

+0

感謝,但是出於某種原因我不能再看到在小部件上的任何項目。小部件只是空白。我的小部件佈局只是一個帶有'包含行'的LinearLayout。我確實爲Android 2.2開發。 – Genkaku 2012-02-12 08:40:51

+0

可否請您顯示您的更新代碼。 – 2012-02-12 12:26:31

+0

你必須把它納入你的問題,請。這是不可能讀的。 – 2012-02-12 12:55:45

相關問題