【问题标题】:How to handle Checkbox call inside getView?如何处理 getView 中的 Checkbox 调用?
【发布时间】:2017-02-26 22:56:30
【问题描述】:

我正在创建一个简单的应用程序,其中在自定义 ListView [项目名称,项目复选框] 中显示项目列表。

我想根据复选框值更改手段 onCheckChange 更新 Activity 的 UI(显示/隐藏 Button,它不是 ListView 的一部分,而是包含 ListViewButton 的 Activity 的一部分)。

下面是我的适配器类getView() 方法代码,它在我要处理的列表加载时调用Activity 方法。

    @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.list_item, null);
                viewHolder = new Holder();
                viewHolder.name = (TextView) convertView.findViewById(R.id.textView_Name);
                viewHolder.check = (CheckBox) convertView.findViewById(R.id.checkBox);

                viewHolder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                        mainDataList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.

            mainDataList.get(position).setLatestChanged(true);
            notifyDataSetChanged();
            activity.setCopyButton(); //This is the call which hides/shows ACTIVITY BUTTON WHICH I WANT TO HANDLE
                    }
                });

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (Holder) convertView.getTag();
            }

            viewHolder.check.setTag(position); // This line is important.
        viewHolder.name.setText(mainDataList.get(position).getName());          

viewHolder.check.setChecked(mainDataList.get(position).isSelected());

            return convertView;
        }

ListView 加载android 时,默认情况下它会根据ITEM 值[T/F] 调用viewHolder.check.setOnCheckedChangeListener。我必须阻止该调用,或者以某种方式我想根据手动复选框单击而不是默认处理 UI 更新。

触发点:

activity.setCopyButton(); //This is the call which hides/shows activity button which I want to handle

【问题讨论】:

  • 我认为只有在任何列表项选中时才启用按钮?

标签: android listview checkbox


【解决方案1】:

不要将位置设置为标签,而是将自定义数据设置为标签,请参见下面的更新代码:-

 @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.list_item, null);
                    viewHolder = new Holder();
                    viewHolder.name = (TextView) convertView.findViewById(R.id.textView_Name);
                    viewHolder.check = (CheckBox) convertView.findViewById(R.id.checkBox);

                   convertView.setTag(viewHolder);
                } else {
                    viewHolder = (Holder) convertView.getTag();
                }

viewHolder.check.setTag(mainDataList.get(position));  
viewHolder.name.setText(mainDataList.get(position).getName());           viewHolder.check.setChecked(mainDataList.get(position).isSelected());
viewHolder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
CustomData data=(CustomData)buttonView.getTag();
data.setSelected(buttonView.isChecked()); 
data.setLatestChanged(true);
notifyDataSetChanged();
activity.setCopyButton(); 
}
                    });
                return convertView;
            }

【讨论】:

    【解决方案2】:

    请改用viewHolder.check.setOnCLickListener()

    在您的代码中替换以下内容,

    viewHolder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
               //... Your code 
           }
    });
    

    有了这个……

    viewHolder.check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
            mainDataList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
    
            mainDataList.get(position).setLatestChanged(true);
            notifyDataSetChanged();
            activity.setCopyButton(); //This is the call which hides/shows ACTIVITY BUTTON WHICH I WANT TO HANDLE
        }
    });
    

    【讨论】:

    • 感谢您的回复。您能否建议我更改相同的代码而不是分开,因为我将在接下来的一天链接其他几个?
    • 已经尝试过这种方法。在这种情况下,getView() 每次加载和向上/向下滚动列表视图时都会调用 viewHolder.check.setOnClickListener。
    • 不应该。您可能会在错误的位置选中复选框。
    • 没有。正如我之前所说的,有些项目已经被选中,所以默认情况下应该选中 Checkbox。
    • 能否提供完整的适配器代码?并且请在发布编辑之前进行适当的格式化。所以它变得更具可读性。
    猜你喜欢
    • 2015-02-22
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2013-03-16
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多