from http://blog.csdn.net/liliang497/article/details/8308313

主要函数

public void setRemoteAdapter (int appWidgetId, int viewId, Intent intent)

当在widgets中使用集合(比如说ListView, StackView等等),在单独的一个条目中设置PendingIntents是非常浪费的,并且是不被允许的。然而一个单独的PendingIntents模板可以设置在集合里,参见setPendingIntentTemplate(int, PendingIntent),并且一个给定条目的单独的on-click的动作可以通过在条目上设置fillInIntent来区别。然后这个fillInIntent就和PendingIntent的实例结合在一起决定最终的被点击执行的intent。规定如下:在PendingIntent实例里,左边为空白的任何区域,但由fillInIntent提供的,将被重写,同时PendingIntent的结果将被使用。然后PendingIntent将被在fillInIntent中设置的有联系的字段填充。

public void setOnClickFillInIntent (int viewId, Intent fillInIntent)

当在widgets中使用集合(比如说ListView, StackView等等)时,在单独的一个条目中设置PendingIntent代价是很昂贵的,因此也是不被允许的。这个方法应该在集合中设置一个单独的PendingIntent模板,然后每一个单独的条目都可以通过setOnClickFillInIntent(int, Intent)来区别他们的点击事件。

public void setPendingIntentTemplate (int viewId, PendingIntent pendingIntentTemplate)

1.布局文件

在Mantifest中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.appwidget"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" > <receiver android:name=".CustomWidget">
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/custom_widget">
</meta-data>
</receiver> <service
android:name=".UpdateService"
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="false" >
</service>
</application> </manifest>

在res/xml/下建立custom_widget.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider
xmlns:android = "http://schemas.android.com/apk/res/android"
android:minWidth="280dp"
android:minHeight="280dp"
android:initialLayout="@layout/widget_layout"
android:updatePeriodMillis="0">
<!-- sdk1.5之后updatePeriodMillis已失效,置为0,循环执行自行在代码中实现 -->
</appwidget-provider>

在res/layout/下建立widget_layout和widget_list_item布局文件

widget_layout.xml

<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"> <ListView
android:id="@+id/widget_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:divider="@drawable/widget_list_divider"
android:listSelector="@drawable/list_bg_selector"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_marginLeft = "5dp"
android:cacheColorHint="#00000000"/> </FrameLayout>

widget_list_item布局文件:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/widget_list_item_layout"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:background="#00000000"
android:orientation="vertical">
<TextView
android:id = "@+id/widget_list_item_tv"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:layout_marginTop = "10dip"
android:layout_marginRight="10dip"
android:layout_marginLeft = "20dp"
android:lineSpacingExtra = "4dip"
android:textSize="20sp"
android:textColor="#FFFFF0"/>
</LinearLayout>

CustomWidget.java

package com.test.appwidget;

import java.util.ArrayList;
import java.util.List; import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews; public class CustomWidget extends AppWidgetProvider{ private static List<String> sList; static{
sList = new ArrayList<String>();
sList.add("第一条新闻");
sList.add("第二条新闻");
sList.add("第三条新闻");
sList.add("第四条新闻");
sList.add("第五条新闻");
sList.add("第六条新闻");
} private ComponentName thisWidget;
private RemoteViews remoteViews; @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){ thisWidget = new ComponentName(context, CustomWidget.class);
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); Intent intent = new Intent(context, UpdateService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[0]);
//设置适配器
remoteViews.setRemoteAdapter(R.id.widget_list, intent); Intent intent2 = new Intent();
//TODO
//intent2.setComponent(new ComponentName("包名", "类名"));
PendingIntent pendingIntentTemplate = PendingIntent.getActivity(context, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT); //拼接PendingIntent
remoteViews.setPendingIntentTemplate(R.id.widget_list, pendingIntentTemplate); //更新RemoteViews
appWidgetManager.updateAppWidget(thisWidget, remoteViews); AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.notifyAppWidgetViewDataChanged(appWidgetIds[0], R.id.widget_list);
} @Override
public void onDisabled(Context context) {
super.onDisabled(context);
} public static List<String> getList(){
return sList;
} }

UpdateService.java

package com.test.appwidget;

import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService; public class UpdateService extends RemoteViewsService { @Override
public void onStart(Intent intent, int startId){
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
return super.onBind(intent);
}
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new ListRemoteViewsFactory(this.getApplicationContext(), intent);
} class ListRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory{ private final Context mContext;
private final List<String> mList; public ListRemoteViewsFactory(Context context, Intent intent){
mContext = context;
mList = CustomWidget.getList(); if(Looper.myLooper() == null){
Looper.prepare();
}
} @Override
public void onCreate() {
} @Override
public void onDataSetChanged() {
} @Override
public void onDestroy() {
mList.clear();
} @Override
public int getCount() {
return mList.size();
} @Override
public RemoteViews getViewAt(int position) {
if(position<0 || position>=mList.size())
return null;
String content = mList.get(position);
final RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item); Intent intent = new Intent();
//TODO
//intent.setComponent(new ComponentName("包名", "类名"));
//与CustomWidget中remoteViews.setPendingIntentTemplate配对使用
rv.setOnClickFillInIntent(R.id.widget_list_item_layout, intent); rv.setTextViewText(R.id.widget_list_item_tv, content); return rv;
} @Override
public RemoteViews getLoadingView() {
return null;
} @Override
public int getViewTypeCount() {
return 1;
} @Override
public long getItemId(int position) {
return position;
} @Override
public boolean hasStableIds() {
return true;
}
}
}

RemoteViews嵌入ListView复杂布局的更多相关文章

  1. Android ListView多布局

    使用listview多布局会出现一点问题: 由于多个item布局给单一的item布局是不一样的,使用起来,contentview的复用会出现问题. 避免出现问题的有这几个方法: 1.重写 getVie ...

  2. 2018-5-28-win10-uwp-动态修改ListView元素布局

    title author date CreateTime categories win10 uwp 动态修改ListView元素布局 lindexi 2018-05-28 15:15:54 +0800 ...

  3. Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题

    一.ScrollView中嵌套ListView ScrollView和ListView都是滚动结构,很明显如果在ScrollView中加入ListView,可以预见性的知道,肯定会有显示/滚动的问题, ...

  4. Android中ListView错位布局实现(无聊向)

    由于某些原因,需要个错位的页面,在网上找不到好的例子,试着动手写了写. 不考虑配色的完成图如下: 首先考虑的是,listview每一行左右都有可能缩进. 先假设一行的布局就是ImageView,Tex ...

  5. ScrollView中嵌入ListView,GridView冲突的解决(让ListView全显示出来)

    ScrollView中嵌入原生ListView或GridView,会出现ListView,GridView显示不全的问题. 解决方法:重新构造一个ListView或GridView,重写OnMeasu ...

  6. 实现顶部轮播,下部listview经典布局的两种方式

    开头: 在做android开发的时候,我们经常会遇到这样的布局,上面是一个图片轮播图,下面是一些列表的项目.很多新闻app,视频类app都采用这样的布局.起初的时候 由于没有很多参考,我自己想到了一种 ...

  7. Android ListView多布局讲解

    Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用.在getView()中减少逻辑计算.减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片.而今天要介绍的 ...

  8. Android修行之路------ListView自定义布局

    主布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  9. flutter控件之ListView滚动布局

    ListView即滚动列表控件,能将子控件组成可滚动的列表.当你需要排列的子控件超出容器大小,就需要用到滚动块. import 'package:flutter/material.dart'; cla ...

随机推荐

  1. iOS开发之获取WIFI信号强度

    虽然各种直接获取信号强度的api都被封杀了.但是还有一个另类的黑魔法可以获取到.那就是遍历UIStatusBar了 - (void)getSignalStrength{ UIApplication * ...

  2. 用函数生成select选择框

    // 生成 html select option 标签 function build_options($options, $opt='',$k='') { $frags = array(); if ( ...

  3. 移动端 设置 小于12px 字体 初探

    1.移动端字号规范 2. 百度字号调研 3. 绕过12px 限制 4. 缩放 5. chrome  字号

  4. WKWebView使用过程中的那些坑

    问题产生背景: 新开发的页面中有一部分的界面是需要展示后端接口返回的HTML代码,包括文字和图片.所以就自然而然的要使用iOS原生的WebKit. 鉴于Xcode 8发布以后,编译器支持的最低版本(D ...

  5. 10.25 noip模拟试题

    今天题目略水2333 依旧不粘题目了23333 T1 /*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同 ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[ ...

  6. 9.28noip模拟试题

    1.栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫.幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫 ...

  7. GridView 无数据时,绑定提示

    private void BindData() { DataTable dt = DAO.RunSQLReturnDt(this.getsql()); int dtcount = dt.Rows.Co ...

  8. CSS的clip-path(转)

    基本概念 clip-path从单词"clip path"的直译上来说,表示的就是裁剪路径.既然有裁剪,咱们就来了解这里面的几个简单的概念. 裁剪就是从某样东西剪切一块.比如说,我们 ...

  9. C#快速排序法

    最近面试的时候,被问到了快速排序法.一时之间,无法想起算法来. 重新看了书本,算法如下: 1)设置两个变量I.J,排序开始的时候:I=0,J=N-1: 2)以第一个数组元素作为关键数据,赋值给key, ...

  10. CentOS安装memcached及配置php的memcache扩展

    遇到的问题: 这个问题主要是linux服务器安装memcached服务后,phpinfo信息没有memcache扩展,所以主要是给php安装memcache扩展,教程中是安装memcache扩展,我认 ...