Android 实现ViewHolder模式的问题
我正在用一本书开发一个android应用程序。 我得到了错误:“犯罪无法解决”,我不明白为什么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) {
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()
的信息检查链接检查链接