2010-10-16 4 views
2

Я застрял на небольшой ошибке, пытаясь реализовать пользовательский список в Java для приложения для Android.Custom ListView Adapter [Android]

Я пытаюсь перечислить слова сложения (обычно, 100 < n < 500) и выделить подмножество этих строк, изменив цвет текста. Оба набора слов (глобальные и подмножества) перечислены в коллекции (в настоящее время ArrayList)

Проблема в том, что некоторые слова отсутствуют. Кажется случайным. Я думаю, что более вероятно, что слова, предназначенные для «выделения», отсутствуют. (Т.е. я попробовал несколько различных вариантов кода, но вот то, что я в настоящее время есть:

public class ResultsAdapter<T> extends ArrayAdapter<String> { 

private ArrayList<String> mHighlightSet; 
private ArrayList<String> mGlobalSet; 
private Context mContext; 

public ResultsAdapter(
    Context context, 
    int textViewResourceId, 
    ArrayList<String> globalSet, 
    ArrayList<String> highlightSet) { 

    super(context, textViewResourceId, globalSet); 

    mContext = context; 
    mGlobalSet = globalSet; 
    mHighlightSet = highlightSet; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // return super.getView(position, convertView, parent); 

    final String text = mGlobalSet.get(position); 

    TextView view = new TextView(mContext); 
    view.setText(text); 

    if(mHighlightSet.contains(text)) 
    view.setTextColor(Color.RED); 
    else 
    view.setTextColor(Color.WHITE); 

    return view; 
} 

Этот обычай адаптер получает экземпляр и присваивается следующий код:

if (mSummaryList != null & mAllWords != null & foundWords != null) { 

    ArrayList<String> globalSet = new ArrayList<String>(mAllWords.keySet()); // mAllWords is a TreeMap 
    ArrayList<String> subset = hud.getFoundWords(); 

    mResultsAdapter = new ResultsAdapter<String>(this, R.layout.simplerow, globalSet, subset); 

    mSummaryList.setAdapter(mResultsAdapter); 
    mSummaryList.setOnItemClickListener(onWordListItemClickListener); 
    } 

оказывается, что есть некоторая нестыковка между переменными данными, и то, что отображается на экране. Я потерял, пожалуйста, помогите.

заранее спасибо!

ответ

1

Это может помочь, если вы проверите это с небольшим количеством слов, чтобы вы могли лучше понять, есть ли у вас проблема. Я предполагаю, что mAllWords - это своего рода карта. Делая mAllWords.keySet(), вы получаете слова в произвольном порядке. Вероятно, это затрудняет определение того, действительно ли там слово. Вы должны попробовать отсортировать слова там или использовать какой-то известный упорядоченный набор, чтобы вы могли лучше рассказать, что происходит.

Кроме того, в getView вы не хотите создавать TextView. Это действительно неэффективно. Вместо этого вы должны получить представление из уже раздутого макета и обновить стиль. I.e, что-то вроде:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 

    TextView textView = view.findById(R.id.text); // id of the text view in R.layout.simplerow 

    String text = textView.getText(); 

    if(mHighlightSet.contains(text)) 
    view.setTextColor(Color.RED); 
    else 
    view.setTextColor(Color.WHITE); 

    return view; 
} 

Супер getView super уже заполнит правильное слово. Вы просто хотите обновить стиль в методе getView.

+0

Спасибо за быстрый ответ Майры! mAllwords был первоначально HashMap изменен на TreeMap из-за его свойств автосортировки. Я не хотел сортировать вручную, поскольку это казалось неэффективным (хотя копирование всех ключей делает по существу одно и то же). Что касается TextView - это фактически элементы * в * ListView. В прошлой версии кода я вытащил существующий объект TextView из «супер» и изменил цвет текста: TextView view = (TextView) super.getView (position, convertView, parent); Я попробую использовать меньшие наборы слов. И сортировка вручную. Еще раз спасибо! – pjama

1

Оказалось, что данные отличаются от того, что я ожидал/думал, что это так. (Майра, вы были в основном правы).

В противном случае исходный код работал бы правильно.

В конце концов, GetView (...) класс выглядит следующим образом:

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

    TextView view = (TextView) super.getView(position, convertView, parent); 

    final String text = (String) view.getText(); 

    if(mHighlightSet.contains(text)) 
     view.setTextColor(Color.RED); 
    else 
     view.setTextColor(Color.WHITE); 

    return view; 
} 
Смежные вопросы