2

I am working on AppWidget for Android. I have a GridView on AppWidget and in every single item of GridView i Have a ProgressBarr. This ProgressBar should be updated Live(as i want to see it progressing from left to right). Unfortunately my code " a thread " is doing it but not accurately . when i scroll down or scroll up i can see change, otherwise everything is just like stopped on the widget. I Have tried to update widget in the Thread it is working . i can see live progress but i got another problem here . Problem is that every single item is expanding on Whole screen and iterating one by one and showing Progress on ProgressBar. I have commented in the Code where i have updated widget and got problem. Please any Help ? I will thankful to you.

This is the screen shot when I drag my widget on home screen then I can see my GridView..

enter image description here

Then cause of that updateWidget call my widget looks like this . it is updating progress bar but I don't want like this . It should be update in the progressBarr as shown above . instead of doing in those gridview items it is expanding items on widget then start iterating items on the widget and also keep updating. enter image description here enter image description here

these are two different items.

My Code is.

public class ListProvider implements RemoteViewsFactory {
private ArrayList<ListItem> listItemList = new ArrayList<ListItem>();
private Context context = null;
private int appWidgetId;
private int mProgressStatus = 0;
AppWidgetManager appWidgetManager ;
private Handler mHandler = new Handler();


public ListProvider(Context context, Intent intent,
        ArrayList<ListItem> listItems) {
    this.context = context;

    appWidgetManager = AppWidgetManager.getInstance(context);
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
    if (listItems != null)
        this.listItemList = (ArrayList<ListItem>) listItems.clone();

}

@Override
public int getCount() {
    return listItemList.size();
}

@Override
public long getItemId(int position) {
    return position;
}

/*
 * Similar to getView of Adapter where instead of View return RemoteViews
 * And using the saved ImagePath to show images on ImageView
 */
@Override
public RemoteViews getViewAt(final int position) {
    final RemoteViews remoteView = new RemoteViews(
            context.getPackageName(), R.layout.list_row);
    final ListItem listItem = listItemList.get(position);
    remoteView.setTextViewText(R.id.heading, (listItem.heading).toUpperCase());

    remoteView.setViewVisibility(R.id.ProgressTime, View.VISIBLE);
    remoteView.setProgressBar(R.id.ProgressTime, 100, mProgressStatus, false);


    Thread worker = new Thread(new Runnable() {

        @Override
        public void run() {
            mProgressStatus=0;
            while(mProgressStatus<100){
                mProgressStatus = mProgressStatus+3;
                try {
                    Thread.sleep(2011);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
                mHandler.post(new Runnable() {
                    public void run() {
                        remoteView.setProgressBar(R.id.ProgressTime, 100, mProgressStatus, false);

                    }
                });

                /////  I have tried doing this ... this solution did work for me but 
                //    this  is expanding one item on whole widget and showing only 
                //    one item on AppWidget instead of showing all GridView
                //    i know this is not gona work properly for me . i Need something else
                ///  tell me from where i should do this call so i can see all gridview at same time 
                //   and can see live update.

                appWidgetManager.updateAppWidget(appWidgetId, remoteView);
            }



        }
    });
    worker.start();


    Bitmap bitmap = BitmapFactory.decodeFile(listItem.fileUrl);
    if (bitmap != null)
        remoteView.setImageViewBitmap(R.id.imageView, bitmap);

    else
        remoteView.setImageViewResource(R.id.imageView, R.drawable.ic_launcher);
    return remoteView;
}
@Override
public RemoteViews getLoadingView() {
    return null;
}

@Override
public int getViewTypeCount() {
    return 1;
}

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public void onCreate() {

}

@Override
public void onDataSetChanged() {
}

@Override
public void onDestroy() {
}

}
Muhammad Adil
  • 4,358
  • 3
  • 32
  • 36

0 Answers0