Android 应用程序小部件listview设计在使用url加载动态图像时发生更改
嗨,我正在使用小部件列表视图。我想在每个小部件listview项上加载图像,所以我使用下面的代码使用url加载图像Android 应用程序小部件listview设计在使用url加载动态图像时发生更改,android,widget,android-widget,Android,Widget,Android Widget,嗨,我正在使用小部件列表视图。我想在每个小部件listview项上加载图像,所以我使用下面的代码使用url加载图像 public class ListProvider implements RemoteViewsService.RemoteViewsFactory { private String TAG = ListProvider.class.getSimpleName(); private Context context = null; private UserPreference u
public class ListProvider implements RemoteViewsService.RemoteViewsFactory {
private String TAG = ListProvider.class.getSimpleName();
private Context context = null;
private UserPreference userPreference;
private int appWidgetId;
private String feedsData, mLaneName, mLaneId;
private Tooteet.Collection collection;
private ArrayList<Item> mItems;
public ListProvider(Context context, Intent intent) {
this.context = context;
userPreference = new UserPreference(context);
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
feedsData = intent.getStringExtra(LargeWidgetProvider.LARGE_WIDGET_LIST_DATA);
mLaneId = intent.getStringExtra(LargeWidgetProvider.WIDGET_LANE_ID);
mLaneName = intent.getStringExtra(LargeWidgetProvider.WIDGET_LANE_NAME);
if(mLaneId != null && mLaneName != null) {
collection = new Tooteet.Collection(feedsData, mLaneId, mLaneName);
}
mItems = getItems(collection);
}
public ArrayList<Item> getItems(Tooteet.Collection collection) {
ArrayList<Item> items = new ArrayList<>();
if (collection == null) {
return items;
}
int sectionFirstPosition = 0;
int i = 0;
for (Tooteet tooteet : collection.getItems()) {
int type = tooteet.getTweetType();
int viewType = VIEW_TYPE_TEXT;
switch (type) {
case TooteetType.TEXT:
case TooteetType.NOTE:
viewType = VIEW_TYPE_TEXT;
// add text;
break;
case TooteetType.PICTURE:
case TooteetType.DRAWING:
case TooteetType.VIDEO:
viewType = VIEW_TYPE_MEDIA;
// add media
break;
case TooteetType.AUDIO:
case TooteetType.DOCUMENT:
//case TooteetType.EXPENSE:
viewType = VIEW_TYPE_FILE;
// add file
break;
case TooteetType.MEASURE:
viewType = VIEW_TYPE_MEASURE;
break;
case TooteetType.EXPENSE:
viewType = VIEW_TYPE_EXPENSE;
break;
}
Log.d(TAG, "getItems -- tooteet: "+tooteet);
items.add(new Item("", false, tooteet, viewType, sectionFirstPosition, i));
i++;
}
return items;
}
@Override
public int getCount() {
Log.d(TAG, " getCount() -- mItems.size(): "+mItems.size());
return mItems.size();
}
@Override
public long getItemId(int position) {
return position;
}
/*
*Similar to getView of Adapter where instead of View
*we return RemoteViews
*
*/
@Override
public RemoteViews getViewAt(final int position) {
Log.d(TAG,"=============getViewAt position=========="+position);
RemoteViews remoteView = null;
final Item item = mItems.get(position);
if (item.mTooteet.getTweetType() == TooteetType.TEXT || item.mTooteet.getTweetType() == TooteetType.NOTE) {
remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_feed_list_text);
remoteView.setImageViewResource(R.id.feed_type,R.drawable.feed_list_note);
} else if (item.mTooteet.getTweetType() == TooteetType.PICTURE || item.mTooteet.getTweetType() == TooteetType.DRAWING || item.mTooteet.getTweetType() == TooteetType.VIDEO) {
remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_feed_list_image);
int drawable = R.drawable.feed_list_attachment;
if (item.mTooteet.getTweetType() == TooteetType.PICTURE) {
drawable = R.drawable.feed_list_picture;
} else if (item.mTooteet.getTweetType() == TooteetType.VIDEO) {
drawable = R.drawable.feed_list_video;
}else if(item.mTooteet.getTweetType() == TooteetType.DRAWING){
drawable = R.drawable.feed_list_drawing;
}
remoteView.setImageViewResource(R.id.feed_type,drawable);
try {
} catch (Exception e) {
e.printStackTrace();
}
Handler uiHandler = new Handler(Looper.getMainLooper());
final RemoteViews finalRemoteView1 = remoteView;
uiHandler.post(new Runnable(){
@Override
public void run() {
Picasso.with(context).load(item.mTooteet.getThumbUrl1()).into(
finalRemoteView1, R.id.feed_image,
new int[]{appWidgetId});
}
});
} else if (item.mTooteet.getTweetType() == TooteetType.AUDIO || item.mTooteet.getTweetType() == TooteetType.DOCUMENT) {
remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_feed_list_audio);
int drawable;
if (item.mTooteet.getTweetType() == TooteetType.AUDIO) {
drawable = R.drawable.feed_list_audio;
} else {
drawable = FeedDocResourceHandler.getIconResForListDoc(item.mTooteet.getUniqueFileName());
}
remoteView.setImageViewResource(R.id.feed_type,drawable);
} else if (item.mTooteet.getTweetType() == TooteetType.MEASURE) {
remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_feed_list_measure);
}else if (item.mTooteet.getTweetType() == TooteetType.EXPENSE) {
remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_feed_list_expense);
}
remoteView.setTextViewText(R.id.feed_keywords, item.mTooteet.getKeywords());
if(!TextUtils.isEmpty(item.mTooteet.getTooteetText())){
remoteView.setViewVisibility(R.id.feed_text, View.VISIBLE);
remoteView.setTextViewText(R.id.feed_text, item.mTooteet.getTooteetText());
}else{
remoteView.setViewVisibility(R.id.feed_text, View.GONE);
}
if (!item.mTooteet.isLocationEmpty()) {
if (!TextUtils.isEmpty(item.mTooteet.getLocationString())) {
remoteView.setViewVisibility(R.id.feed_location, View.VISIBLE);
remoteView.setTextViewText(R.id.feed_location, item.mTooteet.getLocationString());
} else {
final RemoteViews finalRemoteView = remoteView;
ReverseGeocoder.with(Constants.getLanesApp()).load(item.mTooteet, new com.kwypesoft.lanes.location.GeocodeApi.OnLocationListener() {
@Override
public void onReceive(String location) {
if (!TextUtils.isEmpty(location)) {
finalRemoteView.setViewVisibility(R.id.feed_location, View.VISIBLE);
finalRemoteView.setTextViewText(R.id.feed_location, item.mTooteet.getLocationString());
item.mTooteet.setLocationString(location);
}else{
finalRemoteView.setViewVisibility(R.id.feed_location, View.GONE);
}
}
});
}
}else{
remoteView.setViewVisibility(R.id.feed_location, View.GONE);
}
final Intent fillInIntent = new Intent();
fillInIntent.setAction(LargeWidgetProvider.ACTION_TOAST);
final Bundle bundle = new Bundle();
bundle.putString(LargeWidgetProvider.WIDGET_LANE_ID, mLaneId);
bundle.putSerializable(DetailBase.FEED_DETAILS, item.mTooteet);
fillInIntent.putExtras(bundle);
remoteView.setOnClickFillInIntent(R.id.root, fillInIntent);
return remoteView;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 5;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void onCreate() {
}
@Override
public void onDataSetChanged() {
}
@Override
public void onDestroy() {
}
private static class Item{
boolean isHeader;
String header;
public Tooteet mTooteet;
int viewType;
int firstPosition;
int itemPosition;
public Item(String header, boolean isHeader, Tooteet tooteet, int type, int firstPosition, int itemPosition) {
this.header = header;
this.isHeader = isHeader;
mTooteet = tooteet;
this.viewType = type;
this.firstPosition = firstPosition;
this.itemPosition = itemPosition;
}
}
公共类ListProvider实现RemoteViewsService.RemoteViewsFactory{
私有字符串标记=ListProvider.class.getSimpleName();
私有上下文=null;
私人用户偏好;
私有int-appWidgetId;
私有字符串feedsData、mLaneName、mLaneId;
私人图特。收藏;
私有数组列表;
公共ListProvider(上下文、意图){
this.context=上下文;
userPreference=新的userPreference(上下文);
appWidgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,AppWidgetManager.INVALID\u APPWIDGET\u ID);
feedsData=intent.getStringExtra(LargeWidgetProvider.LARGE\u WIDGET\u LIST\u数据);
mLaneId=intent.getStringExtra(LargeWidgetProvider.WIDGET\u LANE\u ID);
mLaneName=intent.getStringExtra(LargeWidgetProvider.WIDGET\u LANE\u NAME);
if(mLaneId!=null&&mLaneName!=null){
collection=新的Tooteet.collection(feedsData、mLaneId、mLaneName);
}
mItems=getItems(集合);
}
公共ArrayList getItems(Tooteet.Collection){
ArrayList items=新建ArrayList();
if(集合==null){
退货项目;
}
int sectionFirstPosition=0;
int i=0;
for(Tooteet-Tooteet:collection.getItems()){
int type=tooteet.getTweetType();
int viewType=视图类型文本;
开关(类型){
case TooteType.TEXT:
案例TooteType.NOTE:
viewType=视图\类型\文本;
//添加文本;
打破
案例TooteType.PICTURE:
案例TooteType.DRAWING:
案例TooteType.VIDEO:
viewType=视图\类型\媒体;
//添加媒体
打破
案例TooteType.AUDIO:
案例TooteType.DOCUMENT:
//案例TooteType.EXPENSE:
viewType=视图类型文件;
//添加文件
打破
案例TooteType.MEASURE:
viewType=视图\类型\度量;
打破
案例TooteType.EXPENSE:
视图类型=视图类型费用;
打破
}
Log.d(标记“getItems--tooteet:+tooteet”);
添加(新项(“”,false,tooteet,viewType,sectionFirstPosition,i));
i++;
}
退货项目;
}
@凌驾
public int getCount(){
Log.d(标记“getCount()--mItems.size():”+mItems.size());
返回mItems.size();
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
/*
*类似于适配器的getView,其中代替了View
*我们返回远程视图
*
*/
@凌驾
公共远程视图getViewAt(最终int位置){
Log.d(标签,”====================================================================================+位置);
RemoteViews remoteView=null;
最终项目=mItems.get(位置);
if(item.mTooteet.getTweetType()==tooteetype.TEXT | | item.mTooteet.getTweetType()==tooteetype.NOTE){
remoteView=新的远程视图(context.getPackageName(),R.layout.widget\u feed\u list\u text);
setImageViewResource(R.id.feed\u类型,R.drawable.feed\u列表\u注释);
}else if(item.mTooteet.getTweetType()==tooteetype.PICTURE | | | item.mTooteet.getTweetType()==tooteetype.DRAWING | | | item.mTooteet.getTweetType()==tooteetype.VIDEO){
remoteView=新的远程视图(context.getPackageName(),R.layout.widget\u feed\u list\u image);
int drawable=R.drawable.feed\u list\u附件;
if(item.mTooteet.getTweetType()==tooteetype.PICTURE){
drawable=R.drawable.feed\u列表\u图片;
}else if(item.mTooteet.getTweetType()==tooteetype.VIDEO){
drawable=R.drawable.feed\u list\u video;
}else if(item.mTooteet.getTweetType()==TooteType.DRAWING){
可绘制=R.drawable.feed\u列表\u图纸;
}
setImageViewResource(R.id.feed_类型,可绘制);
试一试{
}捕获(例外e){
e、 printStackTrace();
}
Handler uiHandler=新处理程序(Looper.getMainLooper());
最终远程视图最终远程视图1=远程视图;
uiHandler.post(新的Runnable(){
@凌驾
公开募捐{
将(item.mTooteet.getThumbUrl1())加载到(
最终删除视图1,R.id.feed_图像,
新的int[]{appWidgetId});
}
});
}else if(item.mTooteet.getTweetType()==tooteetype.AUDIO | | item.mTooteet.getTweetType()==tooteetype.DOCUMENT){
remoteView=新的远程视图(context.getPackageName(),R.layout.widget\u feed\u list\u audio);
int可绘制;
if(item.mTooteet.getTweetType()==tooteetype.AUDIO){
drawable=R.drawable.feed\u list\u audio;
}否则{
drawable=FeedDocResourceHandler.getIconResForListDoc(item.mTooteet.getUniqueFileName());
}
setImageViewResource(R.id.feed_类型,可绘制);
}else if(item.mTooteet.getTweetType()==tooteetype.MEASURE){
remoteView=新的远程视图(context.getPackageName(),R.layout.widget\u feed\u list\u measure);
}else if(item.mTooteet.getTweetType()==tooteetype.EXPENSE){
remoteView=新的远程视图(context.getPackageName(),R.layout.widget\u feed\u list\u expense);
}
setExtViewText(R.id.feed_关键字,item.mTooteet.getKeywords());
如果(!TextUtils.isEmpty(item.mTooteet.getTooteetText())){
setViewVisibility(R.id.feed_text,View.VISIBLE);
setTextViewText(R.id.feed_text,item.mTooteet.getTooteetText());
}否则{
setViewVisibility(R.id.feed_text,View.GONE);
}
如果(!item.mTooteet.isLocationEmpty()){
如果(!TextUtils.isEmpty)(item.mT
Picasso.with(this)
.load("YOUR IMAGE URL HERE")
.error(R.drawable.ic_error_fallback) // optional
.resize(250, 200) // optional
.rotate(90) // optional
.into(imageView);
public class YourViewsFactory implements RemoteViewsService.RemoteViewsFactory
{
Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
Bitmap mBitmap;
Handler handler = new Handler(Looper.getMainLooper());
@Override
public RemoteViews getViewAt(final int position)
{
final RemoteViews row = new RemoteViews(ctxt.getPackageName(), R.layout.row);
flags.put(position, false);
handler.post(new Runnable()
{
@Override
public void run()
{
m_imgLoader.loadImage(YOUR_IMAGE_URL, 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(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
flags.put(position, false);
if (mBitmap != null)
{
row.setImageViewBitmap(R.id.ivPoster, mBitmap);
} else
{
row.setImageViewResource(R.id.ivPoster, R.drawable.cw);
}
mBitmap = null;
} // End of getViewAt override
} // End of class