2014-07-07 81 views
3

我一直在尝试为我的应用程序实现窗口小部件GridView。我是Android开发新手。我在互联网上搜索了很多,但找不到任何有用的东西。我有点卡在这里,因为这没有显示我的GridView上的任何东西。任何帮助,将不胜感激。在Android窗口小部件中的GridView

提前致谢!

这是我的代码

public class MainActivity extends AppWidgetProvider{ 

public static final String TOAST_ACTION = "com.example.widgetdevelopment.TOAST_ACTION"; 
public static final String EXTRA_ITEM = "com.example.widgetdevelopment.EXTRA_ITEM"; 



@Override 
public void onReceive(Context context, Intent intent) { 

    AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
    if (intent.getAction().equals(TOAST_ACTION)) { 
     int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
     int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0); 
     Toast.makeText(context, "Touched view " + viewIndex,  Toast.LENGTH_SHORT).show(); 
    } 
    super.onReceive(context, intent); 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    for (int i = 0; i < appWidgetIds.length; ++i) { 
     Intent intent = new Intent(context, GridWidgetService.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.activity_main); 
     rv.setRemoteAdapter(appWidgetIds[i], R.id.gridView1, intent); 

     rv.setEmptyView(R.id.gridView1, R.id.empty_view); 


     Intent toastIntent = new Intent(context, MainActivity.class); 

     toastIntent.setAction(MainActivity.TOAST_ACTION); 
     toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
     PendingIntent toastPendingIntent; 
    toastPendingIntent=PendingIntent.getBroadcast(context,0,toastIntent,PendingIntent.FLAG_UPDATE_CURRENT); 
     rv.setPendingIntentTemplate(R.id.gridView1, toastPendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetIds[i], rv); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 

} 

} 

这是我RemoteViewServices类

public class GridWidgetService extends RemoteViewsService{ 

@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 
    // TODO Auto-generated method stub 
    return new GridRemoteViewsFactory(this.getApplicationContext(), intent); 
} 

} 



public class GridRemoteViewsFactory implements RemoteViewsFactory { 

private static final int mCount = 10; 
private List<WidgetItem> mWidgetItems = new ArrayList<WidgetItem>(); 
private Context mContext; 
private int mAppWidgetId; 

public GridRemoteViewsFactory(Context context, Intent intent) { 
    mContext = context; 
    mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
} 

@Override 
public void onCreate() { 
    for (int i = 0; i < mCount; i++) { 
     mWidgetItems.add(new WidgetItem(i + "!")); 
    } 
    try { 
     Thread.sleep(3000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

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

} 

@Override 
public void onDestroy() { 
    // mWidgetItems.clear(); 

} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return mCount; 
} 

@Override 
public RemoteViews getViewAt(int position) { 


    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item); 
    rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).getSomething()); 
    Bundle extras = new Bundle(); 
    extras.putInt(MainActivity.EXTRA_ITEM, position); 
    Intent fillInIntent = new Intent(); 
    fillInIntent.putExtras(extras); 
    rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent); 

    return rv; 
} 

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



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

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

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

} 

这是我的对象类。

public class WidgetItem { 
String something; 


public WidgetItem(String something) { 
super(); 
this.something = something; 
} 

public String getSomething() { 
return something; 
} 

public void setSomething(String something) { 
this.something = something; 
} 

} 

Widget_item XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.widgetdevelopment.MainActivity" > 

<TextView 
    android:id="@+id/widget_item" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/hello_world" /> 

</RelativeLayout> 

Main_Activity布局(这种布局是小工具的含GridView控件布局)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="top" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="@string/website" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/textView1" 
    android:layout_below="@+id/textView1" 
    android:text="@string/app_name" /> 

<GridView 
    android:id="@+id/gridView1" 
    android:layout_width="150dp" 
    android:layout_height="100dp" 
    android:layout_alignLeft="@+id/button1" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button1" 
    android:numColumns="3" > 

</GridView> 
<TextView 
    android:id="@+id/empty_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 

    android:textColor="#ffffff" 
    android:textStyle="bold" 
    android:text="empty_view_text" 
    android:textSize="20sp" /> 

    </RelativeLayout> 
+0

您的帖子:) 试试这个没有问题:http://developer.android.com/intl/ru/guide/topics/ui/layout/gridview.html HTTP:/ /www.androidhive.info/2012/02/android-gridview-layout-tutorial/ http://www.mkyong.com/android/android-gridview-example/ – nfirex

+0

我的问题是,有任何教程或步骤来启动?我也看过Google的文档 –

+0

谢谢,但我需要在小部件中实现的兄弟。 :)我也经历了这个教程,但是这是实现** StackView **。 http://www.vogella.com/code/com.example.android.stackwidget/src/com/example/android/stackwidget/StackWidgetService.html –

回答

5

你有注册的服务在AndroidManifest.xml?就像这样:

<service android:name="GridWidgetService" 
    android:permission="android.permission.BIND_REMOTEVIEWS" /> 
+0

糟糕!我忘了,谢谢你,兄弟,现在这工作正常,谢谢你这么多,你刚刚救了我的一天。 –