GVKun编程网logo

android appwidget listview没有更新(android.widget.listview)

12

关于androidappwidgetlistview没有更新和android.widget.listview的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidAppwidget

关于android appwidget listview没有更新android.widget.listview的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Appwidget textview不更新、Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Widget 中ListView加载网络图片、android – AppWidget alarmmanager没有更新等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

android appwidget listview没有更新(android.widget.listview)

android appwidget listview没有更新(android.widget.listview)

我编写了一个AppWidget,它从ContentProvider中显示ListView中的一些数据,但是我无法更新它.当我第一次创建窗口小部件时,它会正确填充,但在AlarmManager的PendingIntent到达后,ListView上不会发生更新.这是代码:
Intent update = new Intent(context,MenuWidgetProvider.class);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,appWidgetIds);
PendingIntent pIUpdate = PendingIntent.getbroadcast(context,update,0);
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).
set(AlarmManager.RTC,nextTime.toMillis(false),pIUpdate);

Log.d(TAG,"updating: " + dmt.mealName);

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

    RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_menu);
    // meal name
    views.setTextViewText(R.id.widget_locname,prefs.getString(PREF_WIDGET_LOCNAME,""));

    // adapter
    Intent adapter = new Intent(context,MenuWidgetAdapterService.class);
    adapter.putExtra(EXTRA_LOCATIONID,prefs.getInt(PREF_WIDGET_LociD,-1));
    adapter.putExtra(EXTRA_MEALNAME,dmt.mealName);
    adapter.putExtra(EXTRA_DATE,dmt.date.toString());
    views.setRemoteAdapter(R.id.widget_list,adapter);

    // update
    manager.updateAppWidget(widgetId,views);
}

super.onUpdate(context,manager,appWidgetIds);

奇怪的是,当更新发生时,onUpdate()方法运行 – 我看到Log.d调用的输出 – 但我的RemoteViewsFactory中没有调用onDataSetChanged().即使我调用notifyAppWidgetViewDataChanged,也没有效果.

解决方法

这是因为您的RemoteViewsFactory缓存了为每个窗口小部件ID创建的工厂.因此,当相同的小部件发送创建新工厂的请求(通过Widget适配器服务)时,将返回相同的工厂.因此,列表视图不是“更新的”.

我是如何解决它的:

在你的WidgetProviderClass中

adapter.setData(Uri.fromParts("content",String.valueOf(appWidgetIds[i]+randomNumber),null));

randomNumber是一个随机数(WidgetProvider类的公共静态成员).

然后在RemoteViewsFactory类中,执行:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart())
            - WidgetProvider.randomNumber;

这让“服务”认为它必须为另一个小部件创建一个Factory,因此创建一个带有更新值的新工厂,该工厂附加到您的小部件.

希望这可以帮助.

Android Appwidget textview不更新

Android Appwidget textview不更新

嗨即时通讯我的 Android小部件有一个非常奇怪的问题,香港专业教育学院看起来很多地方,但我似乎无法弄清楚什么是错的.基本上我在我的小部件中调用pendingintent广播并成功地在onrecivie方法中捕获该意图.

但是在onRecive方法中,当我尝试使用RemoteViews为我的组件设置文本时,文本不会更新,也不会调用任何错误.我在下面附上了我的代码,任何帮助都会很棒.

谢谢,
中号

package com.android.FirstWidget;import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.appwidgetprovider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.RemoteViews;

public class Exampleappwidgetprovider extends appwidgetprovider {

    @Override
    public void onReceive(Context context,Intent intent) {
        // Todo Auto-generated method stub
        Log.e("ds",intent.getAction());
        Log.e("f","f");
        if(intent.getAction().contains("1")){

            RemoteViews views =  new RemoteViews(context.getPackageName(),R.layout.wid);
            views.setTextViewText(R.id.textView1,"heyheyhey");
            Log.e("fssss","sssf");
        }
        super.onReceive(context,intent);
    }

    public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context,Exampleappwidgetprovider.class);
            intent.setAction("1");
            PendingIntent pendingIntent = PendingIntent.getbroadcast(context,intent,0);
            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.wid);
            views.setonClickPendingIntent(R.id.arrowLeft,pendingIntent);
           views.setonClickPendingIntent(R.id.arrowRight,pendingIntent);
//views.set
            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId,views);

        } 

    }
}

解决方法

你需要在onRecieve方法的末尾添加几行….它应该像这样..

package com.android.FirstWidget;import android.app.PendingIntent;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.appwidgetprovider;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageButton;
 import android.widget.RemoteViews;

 public class Exampleappwidgetprovider extends appwidgetprovider {


     @Override
     public void onReceive(Context context,Intent intent) {
         // Todo Auto-generated method stub
         Log.e("ds",intent.getAction());
         Log.e("f","f");

         RemoteViews views =  new RemoteViews(context.getPackageName(),R.layout.wid);
         if(intent.getAction().contains("arrow_left")){
             views.setTextViewText(R.id.textView1,"left");
             Log.e("fssss","sssf");
         }
         else if(intent.getAction().contains("arrow_right")){
             views.setTextViewText(R.id.textView1,"right");
             Log.e("fssss","sssf");
         }

         else {
             super.onReceive(context,intent);
         }
         ComponentName componentName = new ComponentName(context,Exampleappwidgetprovider.class);
         AppWidgetManager.getInstance(context).updateAppWidget(componentName,views);
     }

    public void onUpdate(Context context,Exampleappwidgetprovider.class);
            intent.setAction("arrow_left");
            PendingIntent pendingIntent = PendingIntent.getbroadcast(context,pendingIntent);

            intent = new Intent(context,Exampleappwidgetprovider.class);
            intent.setAction("arrow_right");
            pendingIntent = PendingIntent.getbroadcast(context,views.setonClickPendingIntent(R.id.arrowRight,views);

        } 

    }
}

此外,虽然我相信你编码的内容应该可以工作,但如果没有,你可以尝试在清单文件中设置按钮的intent操作.它应该是这样的

<intent-filter >
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
        <action android:name="com.android.FirstWidget.arrow_left"/>
        <action android:name="com.android.FirstWidget.arrow_right"/>
</intent-filter>

我想现在应该可以了.我自己偶然发现了这个问题,并在此找到了解决方案:Clickable widgets in android

Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView

Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView

我正在尝试打印listView中单击的值,但后来我得到以下异常:

07-04 10:40:56.482: E/AndroidRuntime(1356): FATAL EXCEPTION: main
07-04 10:40:56.482: E/AndroidRuntime(1356): java.lang.classCastException:      android.widget.LinearLayout cannot be cast to android.widget.TextView
07-04 10:40:56.482: E/AndroidRuntime(1356):     at com.passwordkeeper.ui.ActivityHomeScreen$1.onItemClick(ActivityHomeScreen.java:88)

这是一段代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mTextView = (TextView) findViewById(R.id.labelList);
    db = new DatabaseHandler(this);
    createList();
    displayList();
}   

createList函数正常工作.这是我的displayList方法:

public void displayList(){
    this.setlistadapter(new ArrayAdapter<String>(this, R.layout.activity_home_screen, R.id.listTextView, mAccountNames));
    mListView = getListView();
    mListView.setonItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            String product = ((TextView) view).getText().toString();
            Log.v("mSelectedProduct", product);
        }           
    });
}

我的文件activity_home_screen.xml的xml代码是:

<?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" >
<TextView
    android:id="@+id/listTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="28dp"
    android:layout_marginTop="26dp"
    android:textAppearance="?android:attr/textAppearanceLarge" />  

任何帮助都会有用!

谢谢.

解决方法:

你可以试试这个

mListView.setonItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            TextView txtview = (TextView)view.findViewById(R.id.listTextView);
            String product = txtview.getText().toString();
            Log.v("mSelectedProduct", product);
        }           
    });

Android Widget 中ListView加载网络图片

Android Widget 中ListView加载网络图片

关于Widget的介绍和用法可以看这两篇博文,写的非常详细了

Android 之窗口小部件详解--App Widget http://www.cnblogs.com/skywang12345/p/3158310.html 

Android 之窗口小部件高级篇--App Widget 之 RemoteViews http://www.cnblogs.com/skywang12345/p/3264991.html

上面两篇博文没有提到怎么给Widget中的ListView或者GridView中显示网络图片,而我们的项目的需求中需要Widget中的ListView填充接口获得的文字和图片,试过很多方法最后发现还是以下这种伪同步比较让人满意。

        
            private Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
            private Bitmap mBitmap;
            private Handler handler = new Handler(Looper.getMainLooper());


            @Override
            public RemoteViews getViewAt(final int position) { 
                //这里初始化RemoteView,设置监听,等等....

                flags.put(position, false);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //这里用了ImageLoader,或者别的带有加载回调加载库
                        ImageLoader.getInstance().loadImage(datas.get(position).getImgUrl, new SimpleImageLoadingListener() {
                            @Override
                            public void onLoadingStarted(String imageUri, View view) {
                            }
    
                            @Override
                            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                                flags.put(position, true);
                            }
    
                            @Override
                            public void onLoadingCancelled(String imageUri, View view) {
                                flags.put(position, true);
                            }
    
                            @Override
                            public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
                                mBitmap = bitmap;
                                flags.put(position, true);
                            }
                        });
                    }
                });
                //在此一直等待获取到网络图片
                while (!flags.get(position)) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                flags.put(position, false);
                if (mBitmap != null) {
                    mRemoteViews.setImageViewBitmap(R.id.widget_item_image, mBitmap);
                } else {
                    mRemoteViews.setImageViewResource(R.id.widget_item_image, R.mipmap.ic_launcher);
                }
                mBitmap = null;
    
                return mRemoteViews;
            }

android – AppWidget alarmmanager没有更新

android – AppWidget alarmmanager没有更新

所以,我有一个小部件,我希望它每60秒更新一次.当小部件首次添加到主屏幕时,它会正常运行其更新功能.除此之外,它应该启动一个AlarmManager,它将每60秒重新运行一次更新方法.这是它似乎没有真正做的部分.这是我的代码:

public class ClockWidget extends appwidgetprovider {

    public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) {
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout);
            appWidgetManager.updateAppWidget(appWidgetId, views);
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
        Log.d("log","Entered update cycle");
        //Unimportant for these purposes
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }


    private PendingIntent createClockTickIntent(Context context) {
        Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
        PendingIntent pendingIntent = PendingIntent.getbroadcast(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.d("onEnabled","Widget Provider enabled.  Starting timer to update widget every minute");
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context));
    }

    @Override
    public void ondisabled(Context context) {
        super.ondisabled(context);
        Log.d("ondisabled", "Widget Provider disabled. Turning off timer");
        AlarmManager alarmManager = (AlarmManager) context
        .getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(createClockTickIntent(context));
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Log.d("onReceive", "Received intent " + intent);
        if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
            Log.d("onReceive", "Clock update");
            // Get the widget manager and ids for this widget provider, then
            // call the shared
            // clock update method.
            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID: ids) {
                updateAppWidget(context, appWidgetManager, appWidgetID);
            }
        }
    }

}

这是我在这个问题上发现的一些教程的产物,以及我自己对Android的了解.根据我的记录,它永远不会到达Log.d(“onReceive”,“Clock update”);线.是的,我的Manifest设置了时钟更新意图.谢谢!

编辑:其他信息.我在createClockTickIntent方法中放了一个日志行,然后它就会触发.所以我想这意味着我的应用程序正在运行alarmManager.setRepeating行,不知道为什么实际上并没有重复.

解决方法:

Arggghhh,这是一个简单的错字.意图过滤器是“com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE”,我写了“com.nickavv.cleanwidget.CLEANCLOCK_UPDATE”

多么痛苦,但嘿,现在我知道了.

所以,对于任何对我有类似问题的人来说,故事的道德:检查你的拼写!检查两次,或十次.在一切!

我们今天的关于android appwidget listview没有更新android.widget.listview的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Appwidget textview不更新、Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Widget 中ListView加载网络图片、android – AppWidget alarmmanager没有更新的相关信息,请在本站查询。

本文标签: