自定义ListView适配器[Android]

时间:2010-10-16 17:41:44

标签: android listview

我一直坚持尝试在Java中为Android应用程序实现自定义列表视图。

我正在尝试列出一堆字(通常为100

问题在于缺少一些单词。这似乎是随机的。我认为可能更有可能缺少用于“突出显示”的词语。 (即 我尝试了几种不同的代码变体,但这是我目前所拥有的:

 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); 
  }

似乎数据变量之间存在一些脱节,以及屏幕上显示的内容。我迷路了,请帮帮忙。

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果用少量单词进行测试可能会有所帮助,因此您可以更好地了解自己是否确实遇到了问题。我假设mAllWords是某种地图。通过执行mAllWords.keySet(),您将以随机顺序获取单词。这可能很难判断一个单词是否真的存在。你应该尝试对那里的单词进行排序,或者使用一些已知的有序集合,这样你就可以更好地告诉我们发生了什么。

此外,在getView中,您不希望创建TextView。这实在是效率低下。相反,您应该从已经膨胀的布局中获取视图并更新样式。即,像:

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已经填写了正确的单词。您只想更新getView方法中的样式。

答案 1 :(得分: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;
}