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)有一些非常相似的東西 - 每次找到更新時,都會將其添加到窗口小部件。唯一的嚴重分歧,我看到的是,揚巴使用內容解析器和我使用的數據庫...
感謝,但是出於某種原因我不能再看到在小部件上的任何項目。小部件只是空白。我的小部件佈局只是一個帶有'包含行'的LinearLayout。我確實爲Android 2.2開發。 – Genkaku 2012-02-12 08:40:51
可否請您顯示您的更新代碼。 – 2012-02-12 12:26:31
你必須把它納入你的問題,請。這是不可能讀的。 – 2012-02-12 12:55:45