2014-01-07 3 views
3

У меня есть следующий CustomAdapter:Как покрасить определенную часть строки

package com.test.testing; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Locale; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Color; 
import android.graphics.Typeface; 
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.ImageView; 
import android.widget.TextView; 

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> { 
    Context context; 
    int layoutResourceId; 
    ArrayList<SetRows> data=new ArrayList<SetRows>(); 
    DateFormat df = new SimpleDateFormat("EEEEE, LLLL d", Locale.US); 
    String[] suspendedDates = { 
      "Monday, January 20", 
      "Friday, January 31", 
    }; 
    public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ImageHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ImageHolder(); 
      holder.txtTitle = (TextView)row.findViewById(R.id.tvDateVal); 
      //holder.txtTitle.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf")); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.ivIcon0); 
      holder.txtDate = (TextView)row.findViewById(R.id.tvDateNum); 
      holder.txtID = (TextView)row.findViewById(R.id.tvReasonVal); 
      //holder.txtID.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf")); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (ImageHolder)row.getTag(); 
     } 

     SetRows myImage = data.get(position); 
     int inReason = myImage.name.indexOf(","); //myImage.name is the same string as suspendedDates[]; 
     String strR = myImage.name.substring(0, inReason); 
     Spannable WordToSpan = new SpannableString(strR); 
     WordToSpan.setSpan(new ForegroundColorSpan(Color.parseColor("#4787ED")), 0, WordToSpan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     String strRNext = myImage.name.substring(inReason, myImage.name.length()); 
     Spannable WordToSpan1 = new SpannableString(strRNext); 
    WordToSpan1.setSpan(new ForegroundColorSpan(R.color.dateholiday), 0, WordToSpan1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     String strConcat = WordToSpan.toString() + WordToSpan1.toString(); 

     holder.txtTitle.setText(strConcat);//myImage.name); 
     holder.txtID.setText(myImage.id); 
     holder.txtDate.setText(myImage.date); 
     int outImage=myImage.image; 
     /*if (myImage.name.contains(df.format(Calendar.getInstance(Locale.US).getTime()))) { 
      holder.imgIcon.setImageResource(R.drawable.caliconpressed); 
     } 
     else { 
      holder.imgIcon.setImageResource(R.drawable.calicon); 
     }*/ 
     return row; 

    } 

    static class ImageHolder 
    { 
     ImageView imgIcon; 
     TextView txtTitle; 
     TextView txtID; 
     TextView txtDate; 
    } 
} 

Я использую Spannable установить отдельный цвет строки. Предполагается производить что-то вроде этого: enter image description here

Но до сих пор отображения этого:

enter image description here

Кто знает, как изменить адаптер для достижения того, что я ищу делать?

ответ

3

Не конвертируйте свой Spannable в строку. (Т. Е не делают: WordToSpan.toString())

Вместо этого установите Spannable непосредственно в держатель, как это:

holder.txtTitle.setText(WordToSpan + WordToSpan1); 
+0

Это дает мне ошибку с символом +, 'Оператор + не определен для типов аргументов. Android.text.Spannable, android.text.Spannable' – Si8

+0

ОК, вам нужно комбинировать Spannable в противном случае (возможно, вы создаете одиночная spannable строка, с несколькими элементами span). Важной частью моего ответа является НЕ делать преобразование toString(). – Booger

+0

Вы можете использовать SpannableStringBuilder (http://developer.android.com/reference/android/text/SpannableStringBuilder.html), чтобы создать свою оригинальную SpannableString. – Booger

3

Используйте spannable строка следующим образом:

SpannableString ss = new SpannableString("hey #abc how are you."); 
ss.setSpan(new ForegroundColorSpan(Color.RED), 4, 9, 0); 
//Now just add the SpannableString to your textview 
textView.setText(ss); 

Надеется, что это помогает.

С уважением!

+0

Я пытаюсь объединить два. Что не так с моей, если я могу спросить? – Si8

+0

Вы передаете строку, а не спаннируемый объект, когда вы объединяете их здесь «String strConcat = WordToSpan.toString() + WordToSpan1.toString();», так как это то, что вы используете, вы потеряли объект «spannable», который тот, который меняет цвет, поэтому вы устанавливаете только обычную конкатенированную строку, если хотите объединить их, вы сначала соедините, затем добавьте свойства spannable и обязательно передайте spannable в методе setText, а не в String. –

+0

'TextUtils.concat (WordToSpan, WordToSpan1)' работал с моим кодом. Я поддержал ваш ответ. Благодарю. – Si8

Смежные вопросы