2013-01-02 1 views
7

요소 (작업) 목록이 포함 된 안드로이드 위젯을 만들려고합니다.안드로이드의 홈 화면 위젯에서 ListView 채우기

내가 홈 화면에 위젯을 놓으면 비어있어 아무 작업도 표시되지 않습니다.

나는 빠진 것이 무엇인지 간과하지 않습니다.

미리 도움을 주셔서 감사합니다. 여기

<?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:background="@drawable/widget_background" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/title" 
    style="@android:style/TextAppearance.Medium" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:layout_margin="4dip" 
    android:gravity="center_horizontal" 
    android:text="@+string/TASK_LIST_ACT" > 
</TextView> 

<ListView 
    android:id="@+id/list" 
    style="@android:style/TextAppearance.Medium" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</ListView> 

이리스트 뷰

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget_element" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:minHeight="?android:attr/listPreferredItemHeight" /> 

의 항목에 대한 레이아웃이 내 widgetProvider 클래스입니다 내 widget_layout.xml에 대한 XML입니다

package it.geotask.android.widget; 

import it.geotask.android.R; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.widget.RemoteViews; 

public class TaskWidgetProvider extends AppWidgetProvider { 

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

    for (int i = 0; i < appWidgetIds.length; ++i) { 

     Intent intent = new Intent(context, GeotaskRemoteViewService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       appWidgetIds[i]); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 

     RemoteViews rv = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 

     rv.setRemoteAdapter(appWidgetIds[i], R.id.list, intent); 

     rv.setEmptyView(R.id.list, R.id.empty_view); 
     appWidgetManager.updateAppWidget(appWidgetIds[i], rv); 
    } 

} 
} 

그리고 이것은 내 RemoteViewsFactory입니다

package it.geotask.android.widget; 

import it.geotask.android.R; 
import it.geotask.android.dto.Task; 
import it.geotask.android.service.TaskService; 

import java.util.ArrayList; 
import java.util.List; 

import android.appwidget.AppWidgetManager; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.RemoteViews; 
import android.widget.RemoteViewsService; 

public class GeoTaskRemoteViewsFactory implements 
    RemoteViewsService.RemoteViewsFactory { 

private Context context = null; 
private int appWidgetId; 

private List<Task> taskList = new ArrayList<Task>(); 

public GeoTaskRemoteViewsFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 


} 

public int getCount() { 
    return taskList.size(); 
} 

public long getItemId(int position) { 
    return taskList.get(position).getId(); 
} 

public RemoteViews getLoadingView() { 
    // TODO Auto-generated method stub 
    return null; 
} 

public RemoteViews getViewAt(int position) { 
    RemoteViews row = new RemoteViews(context.getPackageName(), 
      R.layout.row); 

    row.setTextViewText(android.R.id.text1, taskList.get(position) 
      .getName()); 


    return (row); 
} 

public int getViewTypeCount() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

public boolean hasStableIds() { 
    // TODO Auto-generated method stub 
    return false; 
} 

public void onCreate() { 
    taskList = TaskService.getTaskInStateList(context, context 
      .getResources().getString(R.string.DB_STATE_ACTIVE)); 
    taskList.addAll(TaskService.getTaskInStateList(context, context 
      .getResources().getString(R.string.DB_STATE_IN_RANGE))); 
    taskList.addAll(TaskService.getTaskInStateList(context, context 
      .getResources().getString(R.string.DB_STATE_DELAYED))); 

} 

public void onDataSetChanged() { 
    // TODO Auto-generated method stub 

} 

public void onDestroy() { 
    // TODO Auto-generated method stub 

} 

} 

remoteViewsService는 단순히 공장의 인스턴스를 반환합니다.

편집 : 서비스를 선언하는 것을 잊어 버렸습니다. 이제 위젯을 정확한 수의 항목으로 채우지 만 표시된 항목의 이름 대신 "로드 중"이라는 메시지가 표시됩니다.

답변

6

해결되었습니다. stackWidget의 google 예제를 따르고 widgetIds 배열에서 for를 사용하고 int 커서를 ++ i로 증가 시키면 위젯이 작동하지 않습니다. i ++로 작동합니다.

+0

동일한 문제가 있습니다. 항목의 수를 볼 수 있지만 모두 "로드 중 ..."이라고 말하면 i ++로 증가하는 for 루프가 있습니다. –

+0

@KrisB 어떻게 당신의 문제를 해결 했습니까? 나는 같은 것을 얻고있다. – Payal

관련 문제