package com.joelapenna.foursquared.widget; import java.io.IOException; import java.util.Observable; import java.util.Observer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Handler; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.joelapenna.foursquare.types.Group; import com.joelapenna.foursquare.types.Score; import com.joelapenna.foursquared.FoursquaredSettings; import com.joelapenna.foursquared.R; import com.joelapenna.foursquared.util.RemoteResourceManager; public class ScoreListAdapter extends BaseGroupAdapter<Score> implements ObservableAdapter { private static final String TAG = "ScoreListAdapter"; private static final boolean DEBUG = FoursquaredSettings.DEBUG; private static final String PLUS = " +"; private RemoteResourceManager mRrm; private RemoteResourceManagerObserver mResourcesObserver; private Handler mHandler = new Handler(); private LayoutInflater mInflater; public ScoreListAdapter(Context context, RemoteResourceManager rrm) { super(context); mRrm = rrm; mResourcesObserver = new RemoteResourceManagerObserver(); mInflater = LayoutInflater.from(context); mRrm.addObserver(mResourcesObserver); } public void removeObserver() { mRrm.deleteObserver(mResourcesObserver); } @Override public View getView(int position, View convertView, ViewGroup parent) { // A ViewHolder keeps references to children views to avoid unnecessary // calls to findViewById() on each row. ViewHolder holder; // When convertView is not null, we can reuse it directly, there is no // need to re-inflate it. We only inflate a new View when the // convertView supplied by ListView is null. if (convertView == null) { convertView = mInflater.inflate(R.layout.score_list_item, null); // Creates a ViewHolder and store references to the two children // views we want to bind data to. holder = new ViewHolder(); holder.scoreIcon = (ImageView) convertView.findViewById(R.id.scoreIcon); holder.scoreDesc = (TextView) convertView.findViewById(R.id.scoreDesc); holder.scoreNum = (TextView) convertView.findViewById(R.id.scoreNum); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } Score score = (Score) getItem(position); holder.scoreDesc.setText(score.getMessage()); String scoreIconUrl = score.getIcon(); if (!TextUtils.isEmpty(scoreIconUrl)) { try { Bitmap bitmap = BitmapFactory.decodeStream(// mRrm.getInputStream(Uri.parse(score.getIcon()))); holder.scoreIcon.setImageBitmap(bitmap); } catch (IOException e) { if (DEBUG) Log.d(TAG, "Could not load bitmap. We don't have it yet."); holder.scoreIcon.setImageResource(R.drawable.default_on); } holder.scoreIcon.setVisibility(View.VISIBLE); holder.scoreNum.setText(PLUS + score.getPoints()); } else { holder.scoreIcon.setVisibility(View.INVISIBLE); holder.scoreNum.setText(score.getPoints()); } return convertView; } static class ViewHolder { ImageView scoreIcon; TextView scoreDesc; TextView scoreNum; } @Override public void setGroup(Group<Score> g) { super.setGroup(g); for (int i = 0; i < group.size(); i++) { Uri iconUri = Uri.parse((group.get(i)).getIcon()); if (!mRrm.exists(iconUri)) { mRrm.request(iconUri); } } } private class RemoteResourceManagerObserver implements Observer { @Override public void update(Observable observable, Object data) { if (DEBUG) Log.d(TAG, "Fetcher got: " + data); mHandler.post(new Runnable() { @Override public void run() { notifyDataSetChanged(); } }); } } }