【问题标题】:Custom ListView Adapter [Android]自定义 ListView 适配器 [Android]
【发布时间】:2010-10-20 02:23:14
【问题描述】:

我在尝试用 Java 为 Android 应用程序实现自定义列表视图时遇到了一个小错误。

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

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

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

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

提前致谢!

【问题讨论】:

    标签: android listview


    【解决方案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;
     }
    

    super 的 getView 已经填写了正确的单词。您只想更新 getView 方法中的样式。

    【讨论】:

    • 感谢梅拉的快速回复! mAllwords 最初是一个 HashMap,由于它的自动排序属性而更改为 TreeMap。我不想手动排序,因为它似乎效率低下(尽管复制所有键基本上是相同的事情)。关于 TextView——这些实际上是 ListView in 中的项目。过去的代码版本,我从“super”中提取了现有的 TextView 对象并修改了文本颜色: TextView view = (TextView) super.getView(position, convertView, parent);我会尝试使用较小的单词集。并手动排序。再次感谢!
    【解决方案2】:

    结果数据与我的预期/想象的不同。 (Mayra,你基本上是正确的)。

    否则原始代码会正常运行。

    最后,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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多