Android 实现ViewHolder模式的问题

Android 实现ViewHolder模式的问题,android,design-patterns,Android,Design Patterns,我正在用一本书开发一个android应用程序。 我得到了错误:“犯罪无法解决”,我不明白为什么 public View getView(int poisition, View convertView , ViewGroup parent) { //If we weren't given a view, inflate one if (convertView == null) {

我正在用一本书开发一个android应用程序。 我得到了错误:“犯罪无法解决”,我不明白为什么

 public View getView(int poisition, View convertView , ViewGroup parent)
        {
            //If we weren't given a view, inflate one
            if (convertView == null)
            {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_crime, null);
                ViewHolder crimeHolder = new ViewHolder();
                crimeHolder.titleTextView = (TextView)convertView.findViewById(R.id.listItemTitleTextView);
                crimeHolder.dateTextView = (TextView)convertView.findViewById(R.id.listItemDateTextView);
                crimeHolder.solvedCheckBox = (CheckBox)convertView.findViewById(R.id.crimeListItemSolvedCheckBox);

                // store the holder with the view
                convertView.setTag(crimeHolder);
            }

            //Configure the view for this Crime
            Crime crime = getItem(poisition);

            if (crime!=null)
            {
这3个选项显示了错误:

                crimeHolder.titleTextView.setText(crime.getTitle());
                crimeHolder.dateTextView.setText(crime.getDate().toString());   
                crimeHolder.solvedCheckBox.setChecked(crime.isSolved());
            }
            return convertView;

        }
    }

    static class ViewHolder
    {
        TextView titleTextView;
        TextView dateTextView;
        CheckBox solvedCheckBox;
    }
像这样试试

public View getView(int poisition, View convertView , ViewGroup parent)
                {
    ViewHolder crimeHolder = null;
                    //If we weren't given a view, inflate one
                    if (convertView == null)
                    {
                        convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_crime, null);
                        crimeHolder = new ViewHolder();
                        crimeHolder.titleTextView = (TextView)convertView.findViewById(R.id.listItemTitleTextView);
                        crimeHolder.dateTextView = (TextView)convertView.findViewById(R.id.listItemDateTextView);
                        crimeHolder.solvedCheckBox = (CheckBox)convertView.findViewById(R.id.crimeListItemSolvedCheckBox);

                        // store the holder with the view
                        convertView.setTag(crimeHolder);
                    }else{
                        crimeHolder=(ViewHolder)convertView.getTag();
                    }

您在if块中声明了crimeHolder,因此在该块中它不可用。请尝试下面的代码

public View getView(int poisition, View convertView , ViewGroup parent)
        {
            ViewHolder crimeHolder = null;
            //If we weren't given a view, inflate one
            if (convertView == null)
            {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_crime, null);
                crimeHolder = new ViewHolder();
                crimeHolder.titleTextView = (TextView)convertView.findViewById(R.id.listItemTitleTextView);
                crimeHolder.dateTextView = (TextView)convertView.findViewById(R.id.listItemDateTextView);
                crimeHolder.solvedCheckBox = (CheckBox)convertView.findViewById(R.id.crimeListItemSolvedCheckBox);

                // store the holder with the view
                convertView.setTag(crimeHolder);
            }

            //Configure the view for this Crime
            Crime crime = getItem(poisition);

            if (crime!=null)
            { crimeHolder.titleTextView.setText(crime.getTitle());
            crimeHolder.dateTextView.setText(crime.getDate().toString());   
            crimeHolder.solvedCheckBox.setChecked(crime.isSolved());
        }
        return convertView;

    }
}

static class ViewHolder
{
    TextView titleTextView;
    TextView dateTextView;
    CheckBox solvedCheckBox;
}

在ViewHolder类中删除static并使用public使用this
ViewHolder.titleTextView
当我这样做时,我会得到一个错误“局部变量crimeHolder可能尚未初始化”,但在开始时将crimeHolder初始化为null可以解决此问题。非常感谢。更新了我的答案。如果对你有效,请接受并投票:)我已经接受了第一个答案。我不能两者都接受,对吗?上面说我还不能投票:/对不起。。顺便说一句,为什么我的问题是-2?没关系!没问题,很好用。谢谢你能给我解释一下setTag和GETAG吗?在书中,以及我读过的其他解释ViewHolder模式的教程中,他们没有提到任何关于getTag的内容,因此我很高兴了解您的实现。@BVtp view holder模式在您的应用程序中几乎没有性能增益,不要使用它,它确实比实际速度更麻烦benefit@BVtpandroid开发者说:与IDs不同,标记不用于标识视图。标记本质上是可以与视图关联的额外信息。它们通常用于方便地将与视图相关的数据存储在视图本身中,而不是将它们放在单独的结构中。另外,我在这里找到了有关
setTag()getTag()
的信息检查链接检查链接