ListView 未在 App Widget 中显示数据
Posted
技术标签:
【中文标题】ListView 未在 App Widget 中显示数据【英文标题】:ListView not showing data in App Widget 【发布时间】:2014-05-14 03:22:18 【问题描述】:我正在尝试为我的应用程序实现一个简单的集合小部件,我正在尝试在小部件中显示 ListView
,但 ListView
卡在加载中......并且永远无法完成加载,我有数据库中的数据和列表视图仍然卡在它上面。
这是我的 AppWidgetProvider 类中的 onUpdate
方法:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
int length = appWidgetIds.length;
for (int x = 0; x < length; x++)
RemoteViews remote = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(context,RViewsService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[x]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
remote.setRemoteAdapter(R.id.list,intent);
remote.setEmptyView(R.id.list,R.id.empty);
remote.setTextViewText(R.id.title,Utilities.setDayOfWeek());
////////////////////////////////////////////////////////////////////////////////////////////////////////
Intent AddmateriaIntent = new Intent(context,AddMateria.class);
PendingIntent pendingItentForButtonAddMateria = PendingIntent.getActivity(context,0,AddmateriaIntent,0);
remote.setOnClickPendingIntent(R.id.add,pendingItentForButtonAddMateria);
remote.setOnClickPendingIntent(R.id.empty, pendingItentForButtonAddMateria);
appWidgetManager.updateAppWidget(appWidgetIds[x],remote);
super.onUpdate(context,appWidgetManager,appWidgetIds);
我可以检查并且方法onUpdate
完成它的工作没有错误。
这是 RemoteViewService 和 RemoteViewsFactory,它们也不会在 logCat 上显示错误。
公共类 RViewsService 扩展 RemoteViewsService
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
return new RViewFactory(getApplicationContext(),intent);
class RViewFactory implements RemoteViewsFactory
private DBAdapter adapter;
private ArrayList<Materia> materias;
private Context context;
public RViewFactory(Context context,Intent intent)
this.context = context;
@Override
public void onCreate()
adapter = new DBAdapter(context).openReadableDatabase();
materias = new ArrayList<Materia>();
Cursor cursor = adapter.query(Utilities.setDayAndTable(), new String[]DBAdapter.ROW_SUBJECT,DBAdapter.ROW_COLOR_NAME,DBAdapter.ROW_COLOR_HEX, null, null, null, null, null);
if (cursor != null)
if (cursor.moveToFirst())
while (!cursor.isAfterLast())
Materia materia = new Materia();
materia.setSubject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_SUBJECT)));
materia.setColor(new ColorObject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_COLOR_NAME)),
(cursor.getInt(cursor.getColumnIndex(DBAdapter.ROW_COLOR_HEX)))));
materias.add(materia);
Log.d("log", "Data: " + materia.getSubject());
cursor.moveToNext();
cursor.close();
@Override
public void onDataSetChanged()
@Override
public void onDestroy()
materias = null;
adapter.close();
@Override
public int getCount()
return materias.size();
@Override
public RemoteViews getViewAt(int i)
RemoteViews remote = new RemoteViews(context.getPackageName(),android.R.layout.simple_list_item_1);
remote.setTextViewText(android.R.id.text1,materias.get(i).getSubject());
remote.setTextColor(android.R.id.text1,materias.get(i).getColor().getColor());
return remote;
@Override
public RemoteViews getLoadingView()
return null;
@Override
public int getViewTypeCount()
return 0;
@Override
public long getItemId(int i)
return i;
@Override
public boolean hasStableIds()
return false;
在 LogCat 中,加载 Widget 时我找不到错误或警告,它仅在读取光标时显示(我已从 LogCat 中删除文本,因为它与 GC 有关)。
Logcat
05-02 12:54:30.796 21885-21885/schooltimetable.app D/cannon﹕ Data: Math
05-02 12:54:30.806 21885-21885/schooltimetable.app D/cannon﹕ Data: Theory
而且我确信光标会返回 de 数据,因为我已将其记录在 Logcat 中,并且如上所示。
这是声明 AppWidgetProvider 和 RemoteViewService 的 Manifest sn-p:
<receiver android:name="schooltimetable.app.appWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/cannon_widget" />
</receiver>
<service android:name=".RViewsService" android:permission="android.permission.BIND_REMOTEVIEWS"/>
我正在 Nexus 7 (2012) 上测试我的应用:Android 4.4.2
谢谢。
【问题讨论】:
【参考方案1】:将getViewTypeCount
的返回计数改为1。
getViewTypeCount
是工厂将返回的 View 类型的数量。
@Override
public int getViewTypeCount()
return 1;
【讨论】:
【参考方案2】:我遇到了同样的问题,因为我将自定义视图放在列表行中,如果有,请尝试删除它们。
【讨论】:
以上是关于ListView 未在 App Widget 中显示数据的主要内容,如果未能解决你的问题,请参考以下文章
未在 Searchview 中显示正确的 Listview 项目
android listview getviewtypecount和getItemViewType
android 中的appwidget中加了listview,怎么让点击listview中的item后跳转到app主页面