【发布时间】:2017-04-25 13:59:48
【问题描述】:
我有下一个问题:我使用以下适配器来填充 ListView:
public class PlaylistCursorAdapter extends CursorAdapter{
public PlaylistCursorAdapter(Context context, Cursor cursor){
super(context, cursor, 0);
}
public static class ViewHolder{
CheckBox checkBox;
TextView playlistTitle;
public ViewHolder(View view){
checkBox = (CheckBox)view.findViewById(R.id.checkBox);
playlistTitle = (TextView)view.findViewById(R.id.playlistTitle);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
View view = LayoutInflater.from(context).inflate(R.layout.playlist_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder viewHolder = (ViewHolder)view.getTag();
viewHolder.checkBox.setVisibility(View.GONE);
int playlistName = cursor.getColumnIndex(MediaStore.Audio.Playlists.NAME);
String playlist = cursor.getString(playlistName);
viewHolder.playlistTitle.setText(playlist);
}
}
如您所见,我在行中有一个复选框,该复选框在一开始就消失了,我想做的是在执行 onItemLong 时显示所有这些(复选框)。
实际上,我已经在我的活动中实现了 onItemLong,并且使用以下代码几乎完成了该任务:
public void showCheckBoxes(){
for(int i = 0; i != playlist.getAdapter().getCount(); i++) {
mCheckBox = (CheckBox) playlist.getChildAt(i).findViewById(R.id.checkBox);
mCheckBox.setVisibility(View.VISIBLE);
getActivity().invalidateOptionsMenu();
}
}
该方法可以正常工作,直到您可以在屏幕上看到 ListView 中的所有项目。 但后来我注意到 (mCheckBox = (CheckBox) playlist.getChildAt(i).findViewById(R.id.checkBox);) - 实际上是新问题,因为如果我的列表视图比屏幕长,我总是会收到以下错误 - (java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.view.View android.view.View.findViewById(int)')然后应用程序崩溃。
是的,我明白为什么会这样,但不知道如何解决问题。
如果有人能给我答案、提示、链接或一些如何解决问题的想法,我将不胜感激。
是否可以通过某种方式更改代码以显示/隐藏复选框。也许有一种方法可以做到这一点,而无需一直调用 .findViewById。
提前谢谢你。
【问题讨论】:
-
你试过不使用viewHolder吗?我从来没有使用过,在适配器中使视图可见/消失也没有问题。
-
你好,是的,一开始适配器类中没有 ViewHolder,我在注意到问题后实现了它。我认为它会起作用,但是因为我在活动中的复选框上调用 .findViewById 它并不能双向起作用。
标签: java android listview checkbox