package com.merono.g; import android.app.Activity; import android.content.Context; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.TextView; import com.android.volley.toolbox.NetworkImageView; import java.util.ArrayList; public class PostAdapter extends ArrayAdapter<Post> { private int postItemResourceId; private Activity mActivity; private View.OnTouchListener mTouchListener; private LayoutInflater mInflater; private final int greenTextColour; public PostAdapter(Activity activity, int resourceId, ArrayList<Post> posts, View.OnTouchListener listener) { super(activity, resourceId, posts); postItemResourceId = resourceId; mActivity = activity; mTouchListener = listener; mInflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); greenTextColour = activity.getResources().getColor(R.color.green_text); } @Override public View getView(int position, final View convertView, ViewGroup parent) { final View view = getWorkingView(convertView, parent); final ViewHolder viewHolder = getViewHolder(view); final Post entry = getItem(position); if (mTouchListener != null) { view.setOnTouchListener(mTouchListener); } String idLabel = mActivity.getString(R.string.id_label, entry.getId()); viewHolder.nameView.setText(entry.getName()); viewHolder.timeView.setText(entry.getTime()); viewHolder.idView.setText(idLabel); makeGreenText(viewHolder.bodyView, entry.getText()); if (!entry.hasImgUrl()) { viewHolder.imageFrameLayout.setVisibility(View.GONE); } else { viewHolder.imageFrameLayout.setVisibility(View.VISIBLE); GApplication appState = (GApplication) mActivity.getApplication(); viewHolder.imageView.setImageUrl(entry.getImgURL(), appState.mImageLoader); } return view; } private View getWorkingView(final View convertView, ViewGroup parent) { if (convertView == null) { return mInflater.inflate(postItemResourceId, parent, false); } else { return convertView; } } private static class ViewHolder { public TextView nameView; public TextView timeView; public TextView idView; public TextView bodyView; public FrameLayout imageFrameLayout; public NetworkImageView imageView; } private ViewHolder getViewHolder(final View workingView) { // The viewHolder allows us to avoid re-looking up view references // Since views are recycled, these references will never change final Object tag = workingView.getTag(); ViewHolder viewHolder; if (tag == null || !(tag instanceof ViewHolder)) { viewHolder = new ViewHolder(); viewHolder.nameView = (TextView) workingView .findViewById(R.id.post_name); viewHolder.timeView = (TextView) workingView .findViewById(R.id.post_time); viewHolder.idView = (TextView) workingView .findViewById(R.id.post_id); viewHolder.bodyView = (TextView) workingView .findViewById(R.id.post_body); viewHolder.imageFrameLayout = (FrameLayout) workingView .findViewById(R.id.post_img_frame); viewHolder.imageView = (NetworkImageView) workingView .findViewById(R.id.post_img); workingView.setTag(viewHolder); } else { viewHolder = (ViewHolder) tag; } return viewHolder; } private void makeGreenText(TextView tv, String text) { int spanStart; int spanEnd = 0; final String targetStart = "\n>"; final String targetEnd = "\n"; Spannable spanRange = new SpannableString(text); // case where first line is green text if (text.indexOf(">") == 0) { spanEnd = text.indexOf(targetEnd); if (spanEnd < 0) { spanEnd = text.length(); } ForegroundColorSpan foreColour = new ForegroundColorSpan(greenTextColour); spanRange.setSpan(foreColour, 0, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } while (true) { spanStart = text.indexOf(targetStart, spanEnd); // Need a new span object every loop, else it just moves the span ForegroundColorSpan foreColour = new ForegroundColorSpan(greenTextColour); if (spanStart < 0) { break; } // +1 so that the '\n' in target isn't found spanEnd = text.indexOf(targetEnd, spanStart + 1); if (spanEnd < 0) { spanEnd = text.length(); } spanRange.setSpan(foreColour, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } tv.setText(spanRange); } }