【问题标题】:How to show/hide check boxes in ListView programmatically如何以编程方式显示/隐藏 ListView 中的复选框
【发布时间】: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


【解决方案1】:

执行以下操作

public class PlaylistCursorAdapter extends CursorAdapter{

public boolean isAllItemsVisible;

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();
if(isAllItemsVisible)
    viewHolder.checkBox.setVisibility(View.VISIBLE);
else
    viewHolder.checkBox.setVisibility(View.GONE);
int playlistName = cursor.getColumnIndex(MediaStore.Audio.Playlists.NAME);
String playlist = cursor.getString(playlistName);

viewHolder.playlistTitle.setText(playlist);
}
}

我只使用一个名为isAllItemsVisible 的布尔值来保持所有项目的可见性。

要显示所有checkbox,您只需调用以下方法。

public void showCheckBoxes(){
   mplaylistCursorAdapter.isAllItemVisible=true;
   mplaylistCursorAdapter.notifyDatasetChanged();
}

试试这个!希望它对你有用!

【讨论】:

  • 您好,非常感谢,maaaan,效果很好,您是明星,您知道吗?:) 抱歉,我现在无法为您的答案加 1,因为我只有现在有 11 名声望(我在这里有点新手),但肯定会这样做。谢谢,太好了!
  • @LevanVoronin 乐于助人!干杯!
猜你喜欢
  • 2018-12-29
  • 2018-02-24
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多