Java tutorial
/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alboteanu.android.sunshine.app; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.alboteanu.android.sunshine.app.data.WeatherContract; import com.bumptech.glide.Glide; import com.google.android.gms.ads.AdRequest; /** * {@link ForecastAdapter} exposes a list of weather forecasts * from a {@link android.database.Cursor} to a {@link android.support.v7.widget.RecyclerView}. */ public class ForecastAdapter extends RecyclerView.Adapter<ForecastAdapter.ForecastAdapterViewHolder> { private static final int VIEW_TYPE_TODAY = 0; private static final int VIEW_TYPE_FUTURE_DAY = 1; // private static final int VIEW_TYPE_PUB =2 ; // private static final int VIEW_TYPE_IMG =3 ; // Flag to determine if we want to use a separate view for "today". private boolean mUseTodayLayout = true; private Cursor mCursor; final private Context mContext; final private ForecastAdapterOnClickHandler mClickHandler; final private View mEmptyView; final private ItemChoiceManager mICM; private AdRequest adRequest; /** * Cache of the children views for a forecast list item. */ public class ForecastAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public final ImageView mIconView; public final TextView mDateView; public final TextView mDescriptionView; public final TextView mHighTempView; public final TextView mLowTempView; // public final AdView adView; public ForecastAdapterViewHolder(View view) { super(view); mIconView = (ImageView) view.findViewById(R.id.list_item_icon); mDateView = (TextView) view.findViewById(R.id.list_item_date_textview); mDescriptionView = (TextView) view.findViewById(R.id.list_item_forecast_textview); mHighTempView = (TextView) view.findViewById(R.id.list_item_high_textview); mLowTempView = (TextView) view.findViewById(R.id.list_item_low_textview); view.setOnClickListener(this); // adView = (AdView) view.findViewById(R.id.adView); } @Override public void onClick(View v) { int adapterPosition = getAdapterPosition(); mCursor.moveToPosition(adapterPosition); int dateColumnIndex = mCursor.getColumnIndex(WeatherContract.WeatherEntry.COLUMN_DATE); mClickHandler.onClick(mCursor.getLong(dateColumnIndex), this); mICM.onClick(this); } } public interface ForecastAdapterOnClickHandler { void onClick(Long date, ForecastAdapterViewHolder vh); } public ForecastAdapter(Context context, ForecastAdapterOnClickHandler dh, View emptyView, int choiceMode) { mContext = context; mClickHandler = dh; mEmptyView = emptyView; mICM = new ItemChoiceManager(this); mICM.setChoiceMode(choiceMode); } /* This takes advantage of the fact that the viewGroup passed to onCreateViewHolder is the RecyclerView that will be used to contain the view, so that it can get the current ItemSelectionManager from the view. One could implement this pattern without modifying RecyclerView by taking advantage of the view tag to store the ItemChoiceManager. */ @Override public ForecastAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { if (viewGroup instanceof RecyclerView) { int layoutId = -1; switch (viewType) { case VIEW_TYPE_TODAY: { layoutId = R.layout.list_item_forecast_today; break; } case VIEW_TYPE_FUTURE_DAY: { layoutId = R.layout.list_item_forecast; break; } /* case VIEW_TYPE_PUB: { layoutId = R.layout.list_item_pub; break; }*/ } View view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, false); view.setFocusable(true); return new ForecastAdapterViewHolder(view); } else { throw new RuntimeException("Not bound to RecyclerView"); } } @Override public void onBindViewHolder(final ForecastAdapterViewHolder forecastAdapterViewHolder, int position) { mCursor.moveToPosition(position); int weatherId = mCursor.getInt(ForecastFragment.COL_WEATHER_CONDITION_ID); int defaultImage; boolean useLongToday; switch (getItemViewType(position)) { case VIEW_TYPE_TODAY: defaultImage = Utility.getArtResourceForWeatherCondition(weatherId); useLongToday = true; break; /* case VIEW_TYPE_PUB: defaultImage = Utility.getArtResourceForWeatherCondition(weatherId); useLongToday = false; if(adRequest==null){ adRequest = new AdRequest.Builder() .addTestDevice(mContext.getString(R.string.test_device)) .build(); forecastAdapterViewHolder.adView.loadAd(adRequest); forecastAdapterViewHolder.adView.setAdListener(new AdListener() { @Override public void onAdLoaded() { super.onAdLoaded(); forecastAdapterViewHolder.adView.setVisibility(View.VISIBLE); } }); } break;*/ default: defaultImage = Utility.getIconResourceForWeatherCondition(weatherId); useLongToday = false; } if (Utility.usingLocalGraphics(mContext)) { forecastAdapterViewHolder.mIconView.setImageResource(defaultImage); } else { Glide.with(mContext).load(Utility.getArtUrlForWeatherCondition(mContext, weatherId)).error(defaultImage) .crossFade().into(forecastAdapterViewHolder.mIconView); } // this enables better animations. even if we lose state due to a device rotation, // the animator can use this to re-find the original view ViewCompat.setTransitionName(forecastAdapterViewHolder.mIconView, "iconView" + position); // Read date from cursor long dateInMillis = mCursor.getLong(ForecastFragment.COL_WEATHER_DATE); // Find TextView and set formatted date on it forecastAdapterViewHolder.mDateView .setText(Utility.getFriendlyDayString(mContext, dateInMillis, useLongToday)); // Read weather forecast from cursor // String description = Utility.getStringForWeatherCondition(mContext, weatherId); //orig String description = mCursor.getString(ForecastFragment.COL_WEATHER_DESC); // adaugat eu // Find TextView and set weather forecast on it forecastAdapterViewHolder.mDescriptionView.setText(description); forecastAdapterViewHolder.mDescriptionView .setContentDescription(mContext.getString(R.string.a11y_forecast, description)); // For accessibility, we don't want a content description for the icon field // because the information is repeated in the description view and the icon // is not individually selectable // Read high temperature from cursor double high = mCursor.getDouble(ForecastFragment.COL_WEATHER_MAX_TEMP); String highString = Utility.formatTemperature(mContext, high); forecastAdapterViewHolder.mHighTempView.setText(highString); forecastAdapterViewHolder.mHighTempView .setContentDescription(mContext.getString(R.string.a11y_high_temp, highString)); // Read low temperature from cursor double low = mCursor.getDouble(ForecastFragment.COL_WEATHER_MIN_TEMP); String lowString = Utility.formatTemperature(mContext, low); forecastAdapterViewHolder.mLowTempView.setText(lowString); forecastAdapterViewHolder.mLowTempView .setContentDescription(mContext.getString(R.string.a11y_low_temp, lowString)); mICM.onBindViewHolder(forecastAdapterViewHolder, position); } public void onRestoreInstanceState(Bundle savedInstanceState) { mICM.onRestoreInstanceState(savedInstanceState); } public void onSaveInstanceState(Bundle outState) { mICM.onSaveInstanceState(outState); } public void setUseTodayLayout(boolean useTodayLayout) { mUseTodayLayout = useTodayLayout; } public int getSelectedItemPosition() { return mICM.getSelectedItemPosition(); } @Override public int getItemViewType(int position) { // return (position == 0 && mUseTodayLayout) ? VIEW_TYPE_TODAY : VIEW_TYPE_FUTURE_DAY; if (position == 0 && mUseTodayLayout) return VIEW_TYPE_TODAY; // else if (position == 3) return VIEW_TYPE_PUB; else return VIEW_TYPE_FUTURE_DAY; } @Override public int getItemCount() { if (null == mCursor) return 0; return mCursor.getCount(); } public void swapCursor(Cursor newCursor) { mCursor = newCursor; notifyDataSetChanged(); mEmptyView.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE); } public Cursor getCursor() { return mCursor; } public void selectView(RecyclerView.ViewHolder viewHolder) { if (viewHolder instanceof ForecastAdapterViewHolder) { ForecastAdapterViewHolder vfh = (ForecastAdapterViewHolder) viewHolder; vfh.onClick(vfh.itemView); } } }