Android ListView自定义ArrayAdapter - 项目TextView的设置样式不能始终如一地工作

时间:2014-12-03 18:43:51

标签: android sqlite listview android-listview android-arrayadapter

这里有一个奇怪的问题,ListView在调试或LogCat输出时不会呈现代码反映的内容。

这很简单。我正在使用自定义ArrayAdapter和一些POJO实体填充ListView。数据是正确的,并且工作完美,没有任何问题。当用户单击其中一个项目时,我在表格中设置了一个标记,将记录标记为“已读”。在ArrayAdapter中,我正在检查该标志,如果它未读,则将该项设置为粗体。

问题:在点击所有其他项目之前,第一项永远不会被加粗。我可以点击第1项,返回,它仍然是粗体。然后我可以单击项目2,返回,然后项目1和2都不再是粗体。无论我点击多少项,都是一样的。此外,其他一些测试人员已经看到了其他不一致的地方,其中所有项目都会变为粗体,然后从另一个项目返回活动时,它们不再是粗体。

我已经记录并调试过,所有通过的实体都反映了正确的数据,完全符合预期。这是渲染无法正确反映数据。

这是我的第一个,我确定我错过了一些明显的东西。

我的ArrayAdapter:

public class MessageAdapter extends ArrayAdapter<Message>
{
    private List<Message> messages;

    public MessageAdapter(Context context, int resource, List<Message> entities)
    {
        super(context, resource, entities);
        this.messages = entities;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (convertView == null) 
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_message, parent, false);

        Message message = this.messages.get(position);

        if (message != null)
        {
            TextView messageText = (TextView)convertView.findViewById(R.id.messageItemText);
            messageText.setText(String.format("Type: %s Received: %s", message.getType(), StringUtil.getDateTime(message.getReceived())));

            if (message.getIsRead() == 0)
                messageText.setTypeface(null, Typeface.BOLD);
        }       

        return convertView;
    }
}

我的活动:

@Override
protected void onCreate(Bundle savedInstanceState)
{
  List<Message> msgData = data.getAll();
  MessageAdapter adapter = new MessageAdapter(this, R.layout.list_item_message, msgData);
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你必须在if条件

中添加else语句
if (message.getIsRead() == 0)
                messageText.setTypeface(null, Typeface.BOLD);
else 
                messageText.setTypeface(null, Typeface.NORMAL);