- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图搜索有关 StackView Widget 的信息,但我发现了很多,但没有人习惯从 url 获取数据。所以问题是,当我处理 url 时,我的 RemoteViews 是 null ,所以它们什么都不显示。完成该过程后,我想从 asyntask 更新 RemoteViews(在同一类中)。 我该怎么做?或者同步它们?
这是我的 Widget 服务代码:
public class RSSService extends RemoteViewsService {
private ManagerRSS mr;
private Cursor c;
private int lenght;
private List<Provider> mWidgetItems = new ArrayList<Provider>();
private RemoteViews rv = null;
public ArrayList<Item> result = new ArrayList<Item>();
private boolean isFinished = false;
@Override
public void onCreate() {
// TODO Auto-generated method stub
mr = new ManagerRSS(this.getApplicationContext());
mr.open();
mr.openRead();
c = mr.getCursor();
lenght = c.getCount();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
c.close();
mr.close();
super.onDestroy();
}
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
// TODO Auto-generated method stub
return new RSSRemoteViewsFactory(this.getApplicationContext(), intent);
}
class RSSRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory{
private Context mContext;
private int mAppWidgetId;
public RSSRemoteViewsFactory(Context applicationContext, Intent intent) {
// TODO Auto-generated constructor stub
mContext = applicationContext;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return lenght;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public RemoteViews getLoadingView() {
// TODO Auto-generated method stub
return null;
}
@Override
public RemoteViews getViewAt(int position) {
if(isFinished){
rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).getTitle());
if(mWidgetItems.get(position).getTitle().equals("El Pais")){
rv.setImageViewResource(R.id.iNotice, R.drawable.elpais);
}else if(mWidgetItems.get(position).getTitle().equals("Marca")){
rv.setImageViewResource(R.id.iNotice, R.drawable.marca);
}else if(mWidgetItems.get(position).getTitle().equals("As")){
rv.setImageViewResource(R.id.iNotice, R.drawable.as1);
}else if(mWidgetItems.get(position).getTitle().equals("Ideal")){
rv.setImageViewResource(R.id.iNotice, R.drawable.ideal);
}else{
rv.setImageViewResource(0, R.drawable.undefined);
}
rv.setTextViewText(R.id.tvLastNotice, result.get(position).getTitle());
rv.setTextViewText(R.id.tvLastNoticePublish, result.get(position).getPubDate());
Bundle extras = new Bundle();
extras.putString(Widget.NAME_DIARY, mWidgetItems.get(position).getTitle());
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
try {
System.out.println("Loading view " + position);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return rv;
}else{
return null;
}
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 1;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
@Override
public void onCreate() {
while(c.moveToNext()){
String title = c.getString(c.getColumnIndex(Contrato.TableRSS.TITLE));
String link = c.getString(c.getColumnIndex(Contrato.TableRSS.LINK));
long _id = c.getLong(c.getColumnIndex(Contrato.TableRSS._ID));
mWidgetItems.add(new Provider(_id, title, link));
executeThread(link, c.getPosition());
}
}
void executeThread(String type_link,int position){
myThread exe = new myThread();
exe.setOnlyFirst(true);
exe.execute(new String[]{type_link});
}
private class myThread extends MyAsyncTask{
@Override
protected void onPostExecute(ArrayList<Item> result2) {
// TODO Auto-generated method stub
super.onPostExecute(result2);
for(int i=0;i<result2.size();i++) result.add(result2.get(i));
if(result.size()+1 == c.getCount()) isFinished = true;
}
}
@Override
public void onDataSetChanged() {
}
@Override
public void onDestroy() {mWidgetItems.clear();}
}
这是我的 WidgetProvider :
public class Widget extends AppWidgetProvider{
public static final String ON_TOUCH = "com.cool.nightrss.ON_TOUCH";
public static final String ID_DIARY = "com.cool.nightrss.ID_DIARY";
public static final String ID_NOTICE = "com.cool.nightrss.ID_NOTICE";
public static final String NAME_DIARY = "com.cool.nightrss.NAME_DIARY";
public static final String LINK_NOTICE = "com.cool.nightrss.LINK_NOTICE";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(ON_TOUCH)) {
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
String name = intent.getStringExtra(NAME_DIARY);
Toast.makeText(context, "Touched view " + name +" ID "+appWidgetId, Toast.LENGTH_SHORT).show();
}
super.onReceive(context, intent);
}
@SuppressWarnings("deprecation")
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
for (int i = 0; i < appWidgetIds.length; ++i) {
Intent intent = new Intent(context, RSSService.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.stack_view, intent);
Intent toastIntent = new Intent(context, Widget.class);
toastIntent.setAction(Widget.ON_TOUCH);
toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
最佳答案
您可以在类RSSRemoteViewsFactory 中使用方法onDataSetChanged。当您在与该工厂对应的 Collection View 上调用 AppWidgetManager notifyAppWidgetViewDataChanged 时会触发此事件。你可以在这里同步进行起重。例如,如果您需要处理图像、从网络中获取某些内容等,可以在此处同步进行。在此处完成工作时,小部件将保持其当前状态,因此您无需担心锁定小部件。
class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private final String TAG = StackRemoteViewsFactory.class.getSimpleName();
private Context mContext;
private int mAppWidgetId;
private List<Game> mGameItems = new ArrayList<Game>();
public StackRemoteViewsFactory(Context context, Intent intent) {
mContext = context;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
public void onCreate() {
}
public void onDestroy() {
mGameItems.clear();
}
public int getCount() {
return mGameItems.size();
}
public RemoteViews getViewAt(int position) {
Game game = mGameItems.get(position);
Bundle extras = new Bundle();
extras.putString(StackWidgetProvider.EXTRA_ITEM, game.getGameUrl());
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
Bitmap bitmap = null;
try {
URL imageUrl = new URL(game.getImageUrl());
bitmap = BitmapFactory.decodeStream(imageUrl.openConnection().getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
rv.setImageViewBitmap(R.id.widget_item, bitmap);
return rv;
}
public RemoteViews getLoadingView() {
return null;
}
public int getViewTypeCount() {
return 1;
}
public long getItemId(int position) {
return position;
}
public boolean hasStableIds() {
return true;
}
public void onDataSetChanged() {
final String uri = <set your url>
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(uri);
String jsonData = null;
/**
* Fetch JSON from web service
* TODO: try to call a AsyncTask
*/
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
InputStream inputStream = httpEntity.getContent();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder data = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
data.append(line);
}
jsonData = new String(data);
Log.d(TAG, String.format("JSON: %s", jsonData));
} catch (IOException e) {
e.printStackTrace();
}
/**
* Mapping JSON String to objects
* TODO: Probably move the code to a dedicated class and use GSON to do the mapping?????
*/
if(jsonData != null && !jsonData.equals("")) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
for(int index = 0; index < jsonArray.length(); index++) {
JSONObject jsonObject = jsonArray.getJSONObject(index);
String id = jsonObject.getString("id");
String imageUrl = jsonObject.getString("imageUrl");
String gameUrl = jsonObject.getString("gameUrl");
mGameItems.add(
new Game(id, imageUrl, gameUrl)
);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
Log.d(TAG, String.format("List of games: %s", mGameItems));
}
在下面的示例中,我从网络服务器获取 json,然后从每个项目获取图像。 onDataSetChanged 用于获取 json 内容,在 getViewAt 中我获取图像。
查看 Google 提供的 StackView 示例中的评论 - http://docs.huihoo.com/android/3.0/resources/samples/StackWidget/index.html
希望对你有帮助
关于android - 堆栈 View 小部件中带有 RemoteViews 的 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614460/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!