如何获取小部件中的列表单击事件...我无法跟踪单击哪个项目?

时间:2015-05-20 16:50:23

标签: android android-appwidget

package com.adaptavant.setmore.widget;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

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.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;

import com.adaptavant.setmore.R;
import com.adaptavant.setmore.service.WidgetService;
import com.adaptavant.setmore.ui.CreateAppointmentActivity;
import com.adaptavant.setmore.ui.StartActivity;
import com.adaptavant.setmore.util.GlobalVariables;

public class SetmoreWidgetProvider extends AppWidgetProvider {

    public static final String TAG = "SetmoreWidget";
    public static final String WIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
    public static final String EXTRA_LIST_VIEW_ROW_NUMBER = "com.adaptavant.setmore.widget.EXTRA_LIST_VIEW_ROW_NUMBER";
    int mListViewAppID;

    private PendingIntent createUpdateIntent(Context mContext) {
        Intent intent = new Intent(WIDGET_UPDATE);
        PendingIntent lPendingIntent = PendingIntent.getBroadcast(mContext, 22, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return lPendingIntent;
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
    }

    @Override 
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Log.e(TAG, "Action Recieved updating widget");
//      Toast.makeText(context, "updating widget", Toast.LENGTH_LONG).show();

        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
        ComponentName widgetComponent = new ComponentName(context.getPackageName(), this.getClass().getName());
        int[] widgetId = widgetManager.getAppWidgetIds(widgetComponent);
        int widgetNum = widgetId.length;
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.setmore_widget_design);
//        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
//            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//            alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, 1000, createUpdateIntent(context));
//        }
//        //update widget
//        else if (intent.getAction().equals(WIDGET_UPDATE)) {
//            for (int i = 0; i < widgetNum; i++) {
//              views.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());
//                widgetManager.updateAppWidget(widgetId[i], views);
//            }
//        }
//        for (int i = 0; i < widgetNum; i++) {
//          AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
//            int appWidgetIds[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, SetmoreWidgetProvider.class));
//            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.ListView_Widget);
//        }
        AppWidgetManager lAppWidgetManager = AppWidgetManager.getInstance(context);
        int appWidgetIds[] = lAppWidgetManager.getAppWidgetIds(new ComponentName(context, SetmoreWidgetProvider.class));
        lAppWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.ListView_Widget);

        for (int i = 0; i < widgetNum; i++) {
            views.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());
            widgetManager.updateAppWidget(widgetId[i], views);
        }

    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        ComponentName thisWidget = new ComponentName(context, SetmoreWidgetProvider.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        GlobalVariables.APP_WIDGET_MANAGER = appWidgetManager;
        for (int widgetId : allWidgetIds) {

            RemoteViews remoteViews = updateWidgetListView(context, widgetId);
            Intent lIntent = new Intent(context , CreateAppointmentActivity.class);
            lIntent.putExtra("lEditAppt", false);
            PendingIntent lCreateApptIntent = PendingIntent.getActivity(context, 0, lIntent, 0);
            remoteViews.setOnClickPendingIntent(R.id.firstButton, lCreateApptIntent);
            remoteViews.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());

            Intent lLauchApp = new Intent(context , StartActivity.class);
            PendingIntent lStartactivity = PendingIntent.getActivity(context, 0, lLauchApp, 0);
            remoteViews.setOnClickPendingIntent(R.id.widget_header, lStartactivity);
            remoteViews.setPendingIntentTemplate(R.id.ListView_Widget, lStartactivity);
            appWidgetManager.updateAppWidget(widgetId,remoteViews);
        } 

    }

        protected PendingIntent getPendingSelfIntent(Context context, String action) {
            Intent intent = new Intent(context, getClass());
            intent.setAction(action);
            return PendingIntent.getBroadcast(context, 0, intent, 0);
        }

        private RemoteViews updateWidgetListView(Context context, int appWidgetId) {
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.setmore_widget_design);
            Intent lListIntent = new Intent(context, WidgetService.class);
            lListIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            lListIntent.setData(Uri.parse( lListIntent.toUri(Intent.URI_INTENT_SCHEME)));
            remoteViews.setRemoteAdapter(appWidgetId, R.id.ListView_Widget, lListIntent);
            remoteViews.setEmptyView(R.id.ListView_Widget, R.id.empty_view);
            mListViewAppID = appWidgetId;
//          Intent lLauchApp2 = new Intent(context , StartActivity.class);
//          PendingIntent lStartactivity2 = PendingIntent.getActivity(context, 0, lLauchApp2, 0);
//          remoteViews.setOnClickFillInIntent(R.id.ListView_Widget, lStartactivity2);
        return remoteViews;
        }
}



    ListProvider

    package com.adaptavant.setmore.widget;

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Locale;

    import org.apache.commons.lang3.StringEscapeUtils;

    import android.appwidget.AppWidgetManager;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.Color;
    import android.text.Html;
    import android.view.View;
    import android.widget.RemoteViews;
    import android.widget.RemoteViewsService.RemoteViewsFactory;

    import com.adaptavant.setmore.R;
    import com.adaptavant.setmore.util.AppointmentUtility;
    import com.adaptavant.setmore.util.CommonUtilities;
    import com.adaptavant.setmore.util.GlobalVariables;
    import com.adaptavant.setmore.util.LogCat;




    public class ListProvider implements RemoteViewsFactory {
        private Context mContext = null;
        private int appWidgetId;
        String TAG = "ListProvider";
        List<HashMap<String , Object>> mAppointmentList, mAppointmentListDuplicate;
        SharedPreferences mPreference;

        public ListProvider(Context context, Intent intent) {
            this.mContext = context;
            appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
            GlobalVariables.APP_WIDGET_ID = appWidgetId;
            mPreference = GlobalVariables.getSharedPreference(mContext);
            populateListItem();
        }

        private void populateListItem() {

            Calendar lcalendar = Calendar.getInstance(Locale.ENGLISH);
            String lDate                    = new SimpleDateFormat("dd", Locale.ENGLISH).format(lcalendar.getTime());
            String lStartDate               = new SimpleDateFormat("MMM dd yyyy H:mm:ss" , Locale.ENGLISH).format(lcalendar.getTime());
            String lEndDate                 = new SimpleDateFormat("MMM dd yyyy H:mm:ss", Locale.ENGLISH).format(new Date(new Date((lcalendar.get(Calendar.MONTH )+1)+"/"+lDate+"/"+lcalendar.get(Calendar.YEAR)+ " 23:59:59").getTime()));
            setAppointmentToView(lStartDate, lEndDate);
        }

        @Override
        public int getCount() {
            LogCat.infoLog(TAG, "count - "+mAppointmentList.size());
            return mAppointmentList.size();
        }

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

        /*
         * Similar to getView of Adapter where instead of Viewwe return RemoteViews
         */
        @Override
        public RemoteViews getViewAt(int position) {
            final RemoteViews lRemoteView = new RemoteViews(mContext.getPackageName(), R.layout.appointment_row_new);
            HashMap<String, Object> lApptDetailMap = mAppointmentList.get(position);
            int lStatTime                           = Integer.parseInt((String)lApptDetailMap.get("startTime"));
            int lCustomerID                         = R.id.appointment_row_customer_name;
            int lApptTimeID                         = R.id.appointment_row_time;
            int lServiceNameID                      = R.id.appointment_row_service_name;
            int lServiceCodeID                      = R.id.service_color_code;
            int lApptStatusID                       = R.id.appointment_row_status;
            int lServiceDurationID                  = R.id.appointment_row_session;
            int lApptRowLayoutID                    = R.id.appointment_row_layout;

            String lAppCustomCost  = (String) (lApptDetailMap.containsKey("apptCost") && lApptDetailMap.get("apptCost") != null ? lApptDetailMap.get("apptCost"):"");
            String lDisplayCost    = (String) (lAppCustomCost != null && !lAppCustomCost.equals("") ? lAppCustomCost : lApptDetailMap.get("servicecost"));
            long lMillisecond                       = 0;
            try {
                lMillisecond                        = Long.parseLong((String) lApptDetailMap.get("startTimeLong"));
            } catch (Exception e) {
                e.printStackTrace();
            }

            lRemoteView.setTextColor(lCustomerID, Color.parseColor("#30383E"));
            lRemoteView.setTextColor(lApptTimeID, Color.parseColor("#30383E"));

            lRemoteView.setTextViewText(lCustomerID, StringEscapeUtils.unescapeHtml4((String)lApptDetailMap.get("resourcename")).trim().toString());
            lRemoteView.setTextViewText(lServiceNameID, StringEscapeUtils.unescapeHtml4((String)lApptDetailMap.get("servicename")) +", " 
                    +Html.fromHtml(mPreference.getString(GlobalVariables.CURRENCY_SYMBOL, "$"))+StringEscapeUtils.unescapeHtml4(lDisplayCost));
            lRemoteView.setTextViewText(lApptTimeID, StringEscapeUtils.unescapeHtml4(CommonUtilities.convertMinToTime(lStatTime)));
            int lDuration = Integer.parseInt(lApptDetailMap.get("endTime").toString()) - Integer.parseInt(lApptDetailMap.get("startTime").toString());

            try{
                lRemoteView.setViewVisibility(lServiceCodeID, View.VISIBLE);
                lRemoteView.setInt(lServiceCodeID, "setBackgroundColor", Color.parseColor("#"+(String) lApptDetailMap.get("serviceColorCode")));
            }catch(Exception e){
                e.printStackTrace();
            }
            Calendar cal                    = Calendar.getInstance();
            long lOffset                    = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) ;
            long lCurrentTime               = new Date().getTime() + lOffset;
            if(lCurrentTime < lMillisecond || lApptDetailMap.get("apptcustomerkey").equals("slotBlocker")) {
                lRemoteView.setImageViewResource(lApptStatusID, R.drawable.appt_vr_line);
            } else {
                lRemoteView.setImageViewResource(lApptStatusID, R.drawable.complete_appt_tick);
            }

            String lDurationString="";
            if (lDuration>=60) {
                int lHr = lDuration/60;
                int lMin = lDuration%60;
                if(lMin==0 && lHr==1){
                    lDurationString= lHr+"hr";
                }else if(lMin==1 && lHr==1){
                    lDurationString= lHr+"hr "+lMin+"Min";
                }else if(lMin>1 && lHr==1){
                    lDurationString= lHr+"hr "+lMin+"Mins";
                }else if(lMin==1 && lHr>1){
                    lDurationString= lHr+"hrs "+lMin+"Min";
                }else{
                    lDurationString= lHr+"hrs "+lMin+"Mins";
                }
                lRemoteView.setTextViewText(lServiceDurationID, lDurationString);
            } else {
                lRemoteView.setTextViewText(lServiceDurationID, lDuration+" Mins");
            }
            Intent fillInIntent = new Intent();
            fillInIntent.putExtra(SetmoreWidgetProvider.EXTRA_LIST_VIEW_ROW_NUMBER, position);
            lRemoteView.setOnClickFillInIntent(lApptRowLayoutID, fillInIntent);

            return lRemoteView;
        }

        @Override
        public RemoteViews getLoadingView() {
            return new RemoteViews(mContext.getPackageName(), R.layout.loading_layout);
        }

        @Override
        public int getViewTypeCount() {
            LogCat.infoLog(TAG, "size - "+mAppointmentList.size());
            return mAppointmentList.size();
        }

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

        @Override
        public void onCreate() {
    //      populateListItem();
        }

        @Override
        public void onDataSetChanged() {
            populateListItem();
        }

        @Override
        public void onDestroy() {}


        public void setAppointmentToView(String startdate , String enddate) {
            LogCat.infoLog(TAG, "startdate - "+startdate);
            LogCat.infoLog(TAG, "enddate - "+enddate);
            SimpleDateFormat lFormatter                     = new SimpleDateFormat("MMM dd yyyy ", Locale.ENGLISH);
            SimpleDateFormat lFormatterWithTime             = new SimpleDateFormat("MMM dd yyyy H:mm:ss", Locale.ENGLISH);
            try {
                Calendar cal                                = Calendar.getInstance(Locale.ENGLISH);
                long lOffset                                = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) ;
                long lStartMilliSecond                      = lFormatterWithTime.parse(startdate).getTime() + lOffset;
                long lEndMilliSecond                        = lFormatterWithTime.parse(enddate).getTime() +lOffset;
                mAppointmentList                            = new AppointmentUtility().getAppointmentsByDateRange(mContext, lStartMilliSecond, lEndMilliSecond);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

//我无法在onRecieve中获得点击列表项目位置...当我点击列表时...没有出现在onRecieve ...我在做什么错误我不确定... plz帮我发现...我为此浪费了2天...我发布了我所使用的课程... PLZ尽快回复...点击工作......但无法跟踪哪个可能,

0 个答案:

没有答案