Я хочу создать виджет для своего приложения, отображающий несколько строк данных, загружаемых из Интернета.Android-виджет с пользовательскими элементами ListView
У меня есть макет виджета, который содержит представление списка, приложение AppWidgetProvider, RemoteViewsService и RemoteViewsFactory. Служба зарегистрирована в манифесте.
Проблема в том, что я не могу использовать индивидуальные раскладки ListItem. Единственное, что работает в public RemoteViews getViewAt(int position)
, - это использование android.R.layout.simple_list_item_1
, как это сделано во многих основных уроках. Но когда я пытаюсь использовать свой собственный макет, я просто получаю запись «Загрузка ...» для каждой записи (по умолчанию для загрузки).
Вот макет, я хотел бы использовать:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="10dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:layout_width="120dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/cardview_spacing"
android:layout_marginEnd="@dimen/cardview_spacing"
android:layout_gravity="center_horizontal"
android:textSize="@dimen/textTitle"
android:id="@+id/plan_entry_lesson" />
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/cardview_spacing"
android:layout_marginEnd="@dimen/cardview_spacing"
android:layout_gravity="center_horizontal"
android:textSize="@dimen/textTitle"
android:id="@+id/plan_entry_class" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:textSize="@dimen/textSmallTitle"
android:id="@+id/plan_header"
android:text="@string/plan_header"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/cardview_spacing"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:id="@+id/plan"
android:layout_marginLeft="@dimen/cardview_spacing" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:textSize="@dimen/textSmallTitle"
android:id="@+id/subst_header"
android:text="@string/subst_header"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/cardview_spacing"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:id="@+id/subst"
android:layout_marginLeft="@dimen/cardview_spacing" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:textSize="@dimen/textSmallTitle"
android:id="@+id/comment_header"
android:text="@string/comment_header"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/cardview_spacing"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start"
android:id="@+id/comment"
android:layout_marginLeft="@dimen/cardview_spacing" />
</LinearLayout>
</LinearLayout>
Поскольку данные загружаются асинхронно я предположил, что данные не присутствовал на всех или что-то подобное, но мои отладочные выходы показывают, что данные доступно, и созданное представление не является нулевым. Тем не менее, я могу использовать только элемент списка элементов Android.
Любые предложения по этому вопросу?
My getViewTypeCount() возвращает 1 на данный момент! (не 0, который, как представляется, является общей проблемой)
Для полноты: RemoteViewsFactory:
public class WidgetDataProvider implements RemoteViewsService.RemoteViewsFactory {
private static final String TAG = "WidgetDataProvider";
private Vplan plan;
private List<VplanEntry> mCollection = new ArrayList<>();
private Context mContext = null;
public WidgetDataProvider(Context context, Intent intent) {
mContext = context;
plan = new Vplan(mContext, "today");
}
@Override
public void onCreate() {
initData();
}
@Override
public void onDataSetChanged() {
initData();
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
return mCollection.size();
}
@Override
public RemoteViews getViewAt(int position) {
Log.d("WIDGET", "getViewAt " + position);
VplanEntry entry = mCollection.get(position);
Log.d("WIDGET", "entry plan: " + entry.getPlan());
RemoteViews view = new RemoteViews(mContext.getPackageName(),
android.R.layout.simple_list_item_1);
String text = entry.getCls() + " " + entry.getLesson() + ":\n"
+ entry.getPlan() +"\n"
+ entry.getSubstitution() + "\n"
+ entry.getComment();
view.setTextViewText(android.R.id.text1, text);
//view.setTextViewText(R.id.plan_entry_lesson, entry.getLesson());
return view;
}
@Override
public RemoteViews getLoadingView() {
//return new RemoteViews(mContext.getPackageName(),
// R.layout.vplan_appwidget_loading);
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
private void initData() {
mCollection.clear();
if (plan.isLoaded() && plan.upToDate()) {
mCollection.clear();
Log.d("WIDGET", "Data present");
for (VplanEntry entry : plan.getEntries()) {
mCollection.add(entry);
}
Log.d("WIDGET", "Entries: " + mCollection.size());
AppWidgetManager awm = AppWidgetManager.getInstance(mContext);
awm.notifyAppWidgetViewDataChanged(awm.getAppWidgetIds(new ComponentName(mContext, WidgetService.class)), R.id.widgetListView);
} else {
Log.d("WIDGET", "Loading started");
plan.load(new SuccessCallback() {
@Override
public void callback(boolean success) {
Log.d("WIDGET", "Loading finished: " + success);
if (success) {
initData();
}
}
});
}
}
}