Как отобразить разноцветный текст в строке элемента ListView с помощью специального адаптера?

Мой ListView реализует ContextMenu, когда каждая строка LongPressed.

Я решил добавить больше статических данных, разделенных запятыми, а также каждую строку, взятую из ArrayList, для заполнения contextMenu - и все работает отлично.

Старый ListView, Новый ListView

Мой вопрос заключается в том, как правильно использовать подстроку ВНУТРИ моего настраиваемого адаптера, чтобы в Listview отображалось только первое значение (до первой запятой)?

Моя попытка использовать.split для p.getName() с использованием чего-то подобного ниже, имела небольшой успех.

String[] temp;
for (String s: selectedItems) {
   temp = s.split(" ");

Вот мой код getViews:

public View getView(final int position, View convertView, ViewGroup parent) {

    View v = convertView;
    NameHolder holder = new NameHolder();
        // First let's verify the convertView is not null
    if (convertView == null) {
        // This a new view we inflate the new layout
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.imgbtn_row_layout, null);
        // Now we can fill the layout with the right values
        TextView tv = (TextView) v.findViewById(R.id.name);
        TextView distView = (TextView) v.findViewById(R.id.dist);
        ImageButton btnFave = (ImageButton) v.findViewById(R.id.btnone);
        ImageButton btnBuy = (ImageButton) v.findViewById(R.id.btntwo);

        holder.nameView = tv;
        holder.distView = distView;
        holder.btnFave = btnFave;
        holder.btnBuy = btnBuy;

        btnFave.setTag(position);
        btnBuy.setTag(position);

        v.setTag(holder);
    } else {
        holder = (NameHolder) v.getTag();
    }
    final Name p = namesList.get(position);


    String grabbitall = p.getName();
    int cpos = grabbitall.indexOf(",");
    int lcpos = grabbitall.lastIndexOf(",");
    String beginName = grabbitall.substring(0, cpos);
    String endNames = grabbitall.substring(beginName.length(), lcpos-1);
    String eqiuvNames = grabbitall.substring(beginName.length(), grabbitall.length());

    Spannable namesToSpan = new SpannableString(beginName + eqiuvNames);
    namesToSpan.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), beginName.length(), ((beginName.length()+1) + endNames.length()+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    holder.nameView.setText(p.getName());
    holder.distView.setText("" + p.getDistance());

    holder.btnFave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (toggleListener != null) {
                toggleListener.onToggleClickListner(position, p.getName());
            }
        }

    });

    holder.btnBuy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (customListener != null) {
                customListener.onButtonClickListener(position, p.getName());
            }
        }
    });

    final EditText edit = (EditText) v.findViewById(R.id.txtName);
    StringBuilder sb = new StringBuilder();
    SharedPreferences shrdpref = context.getSharedPreferences("namesSpelled", 1);
    SharedPreferences.Editor editr = shrdpref.edit();
    String initialName="xxx";

    // Extract the default initial value stored in SharedPreferences
    String value = shrdpref.getString("namesSpelled", initialName);

    // Append to the extracted value
    String appendedValue =  value + sb.append(selectedName);
    String allvalues = shrdpref.getString("namesSpelled", appendedValue);

    if (allvalues.contains(p.getName())) {
        holder.btnFave.setAlpha(0.2f);
    } else {
        holder.btnFave.setAlpha(1.0f);
    }
       String[] temp;
    final Name s = namesList.get(position);

    String grabbitall = p.getName();
    int cpos = grabbitall.indexOf(",");
    int lcpos = grabbitall.lastIndexOf(",");
    String beginName = grabbitall.substring(0, cpos);
    String endNames = grabbitall.substring(beginName.length(), lcpos-1);
    String eqiuvNames = grabbitall.substring(beginName.length(), grabbitall.length());

    Spannable namesToSpan = new SpannableString(beginName + eqiuvNames);
    namesToSpan.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), beginName.length(), ((beginName.length()+1) + endNames.length()+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    notifyDataSetChanged();
    return v;
}

2 ответа

Я решил проблему, выполнив:

final Planet p = planetList.get(position);

String grabAll= p.getName();
int cpos = grabAll.indexOf(",");
int lcpos = grabAll.lastIndexOf(",");
String beginStr= grabAll.substring(0, cpos);
String endStr= grabAll.substring(beginStr.length(), lcpos-1);
String eqiuvNStr = grabAll.substring(beginStr.length(), grabAll.length());

Spannable namesToSpan = new SpannableString(beginStr+ eqiuvStr);
namesToSpan.setSpan(new ForegroundColorSpan(Color.BLUE), beginStr.length(), ((beginStr.length()+1) + endStr.length()+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

holder.nameView.setText(namesToSpan);

затем я использовал SPANNABLE для обработки частей (начала и конца) каждой строки по-разному. Цвет в ForegroundColorSpan переопределяет цвет, установленный в textView.

Вы можете получить индекс запятой с помощью indexOf:

int pos = s.indexOf(",");

И они делают подстроку между 0 и этим pos - 1:

String name = s.substring(0, pos-1); 
Другие вопросы по тегам