0

我制作了一个包含三个文本视图和一个复选框的列表视图,并将其放入 BaseAdapter。它必须做的是,如果一个项目处于“未读”状态,则使其 textviews BOLD。但是,我遇到了两个问题。

  1. 无论是已读还是未读,最上面的项目始终是粗体。
  2. 如果我进行滚动,则通过滚动重新加载的项目开始为粗体

我对此进行了研究,但找不到任何对我有用的东西。如果有人有想法,请帮助我吗?下面是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;
        }
4

3 回答 3

1

当 ListView 重用一个视图时,它可能在滚动之前是粗体的,现在应该是纯的。尝试在阅读消息时将字体显式设置为 PLAIN。

于 2011-06-06T23:50:57.223 回答
0

您应该通过实现 getItemViewType(int position) 来使用两种类型的视图计数

像这样:

public int getViewTypeCount () {
    return 2;
}

还有这个:

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

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

虽然这是 hack,但我将类型设置为正常或默认,因为您的评论应该是解决方案。你确定 messageRead_list 是正确的吗?

于 2011-06-07T03:19:24.570 回答
0

您将不得不传入nullsetTypeFace()不是使用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));
于 2011-06-07T04:52:44.097 回答