android:getView()问题 - 它在滚动时更改项目

时间:2011-06-06 23:43:32

标签: android android-adapter

我创建了一个包含三个textview和一个复选框的listview,并将其放入BaseAdapter。它必须做的是,如果某个商品处于“未读”状态,则将其文字视图设为 BOLD 。但是,我遇到了两个问题。

  1. 无论是阅读还是未阅读,顶级项目始终为 BOLD
  2. 如果我滚动,则通过滚动开始为粗体重新加载
  3. 我研究了它,但找不到任何有用的东西。如果有人有想法,你能帮帮我吗?下面是getView()。

    
    public View getView(final int position, View convertView, ViewGroup parent) {
                View view = convertView;
                ViewHolder viewHolder;
    
                if(convertView == null){ // check if convertView exists
                    // get and inflate layout
                    view = layoutInflater.inflate(R.layout.row, null);
    
                    viewHolder = new ViewHolder();
                    viewHolder.tv1 = (TextView)view.findViewById(R.id.list_callerIDname);
                    viewHolder.tv2 = (TextView)view.findViewById(R.id.list_callerIDnumber);
                    viewHolder.tv3 = (TextView)view.findViewById(R.id.list_messageSentTime);
                    viewHolder.cb = (CheckBox)view.findViewById(R.id.checkBox1);
    
                    // get each CheckBox into cb_array for future use
                    this.cb_array[position] = (CheckBox)view.findViewById(R.id.checkBox1);
    
                    // use it as a tag
                    view.setTag(viewHolder);
                }
                else{
                    viewHolder = (ViewHolder)view.getTag();
                }
    
                viewHolder.tv1.setText(this.callerIDnames[position]);
                viewHolder.tv2.setText(this.callerIDnumbers[position]);
                viewHolder.tv3.setText(this.messageSentTimes[position]);
    
                // if message is unread, then make texts bold
                if (messageRead_list[position] == false){
                    viewHolder.tv1.setTypeface(viewHolder.tv1.getTypeface(), Typeface.BOLD);
                    viewHolder.tv2.setTypeface(viewHolder.tv2.getTypeface(), Typeface.BOLD);
                    viewHolder.tv3.setTypeface(viewHolder.tv3.getTypeface(), Typeface.BOLD);
                }
    
                return view;
            }
    

3 个答案:

答案 0 :(得分:1)

当ListView重用视图时,它可能在滚动之前是粗体,现在应该是明文。在阅读邮件时,尝试将字体显式设置为PLAIN。

答案 1 :(得分:0)

您应该通过实现getItemViewType(int position)

来使用两种类型的视图计数 像这样:

public int getViewTypeCount () {
    return 2;
}

和此:

public int getItemViewType (int position) {
    if (messageRead_list[position] == false) return 0;
    return 1;
}

然后在创建项目时检查项目类型以设置正确的字体。

这是黑客攻击,我将其设置为正常或默认为on,因为您的评论应该是解决方案。你确定messageRead_list是正确的吗?

答案 2 :(得分:0)

您必须在null中传递setTypeFace(),而不是使用getTypeFace()

getTypeFace()未返回null时,样式将无法正确设置。

// if message is unread, then make texts bold
if (messageRead_list[position] == false){
    viewHolder.tv1.setTypeface(null, Typeface.BOLD);
    viewHolder.tv2.setTypeface(null, Typeface.BOLD);
    viewHolder.tv3.setTypeface(null, Typeface.BOLD);
} else {
    viewHolder.tv1.setTypeface(null, Typeface.NORMAL);
    viewHolder.tv2.setTypeface(null, Typeface.NORMAL);
    viewHolder.tv3.setTypeface(null, Typeface.NORMAL);
}

或者你可以直接使用这个,这是你通过null时所做的。

setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));

setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));