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アプリケーションには、非常によく似たものがあります。アップデートが見つかるたびに、ウィジェットに追加されています。私が見る唯一の重大な違いは、ヤンバは、コンテンツリゾルバを使用していることであると私は、データベースを使用して...
おかげで、助けを願っています。ウィジェットは空白です。私のウィジェットのレイアウトは、 'include行'を持つLinearLayoutです。そして私はAndroid 2.2用に開発しています。 – Genkaku
最新のコードを表示してください。 –
あなたの質問にそれを入れてください。読むことは不可能です。 –