2017-01-24 7 views
1

Я хочу создать виджет для своего приложения, отображающий несколько строк данных, загружаемых из Интернета.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(); 
        } 
       } 
      }); 
     } 

    } 
} 

ответ

0

Проблема заключалась в том, что я макет имел более высокую ширину, чем минимум, необходимый виджет ширину ...

Изменение ширины разрешило проблему.

Смежные вопросы