【问题标题】:How to get a checkbox value using custom adapter and listview如何使用自定义适配器和列表视图获取复选框值
【发布时间】:2016-10-24 03:11:35
【问题描述】:

我正在尝试获取一个检查值,但它没有显示该值,我已经在那里实现了自定义适配器我没有得到如何更新位置

我的代码是..

   public Add_member_adapter(Context a, ArrayList<ItemsModel> d) {

        context = a;
        data = d;
        itemChecked = new boolean[data.size()];

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    public int getCount() {
        if (data.size() <= 0)
            return 1;
        return data.size();
    }

    public final Object getItem(int position) {
        return data.get(getCount() - position - 1);
    }

    public final long getItemId(int position) {
        return position;
    }

    public static class ViewHolder {

        public TextView Name, UserId_Fk;
        CheckBox chkbox;

    }

    public View getView(final int position, View convertView, ViewGroup parent) {

        Log.d("getview:", "position=" + position);
        vi = convertView;
        final ViewHolder holder;

        if (convertView == null) {

            vi = inflater.inflate(R.layout.add_members_list_item, null);
            holder = new ViewHolder();

            holder.Name = (TextView) vi.findViewById(R.id.Name);
            holder.UserId_Fk = (TextView) vi.findViewById(R.id.CusId_Fk);
            holder.chkbox = (CheckBox) vi.findViewById(R.id.chkbox);

            vi.setTag(holder);
        } else {

            holder = (ViewHolder) vi.getTag();

        }
        if (data.size() <= 0) {

            vi.setVisibility(View.GONE);

        } else {

            tempValues = null;
            tempValues = (ItemsModel) data.get(position);

            holder.Name.setText(tempValues.getItemName().toString());
            holder.UserId_Fk.setText(tempValues.getUserId_Fk().toString());
            holder.chkbox.setChecked(false);



            holder.chkbox.setChecked(itemChecked[position]);

            holder.chkbox
                    .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            itemChecked[position] = isChecked;
                        }
                    });
        }
        return vi;
    }

我在活动中声明另一个 List setOnItemClickListener

list.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                CheckBox checkbox = ((CheckBox) view.findViewById(R.id.chkbox));

                String Name = list.getItemAtPosition(position).toString();



            }

        });

【问题讨论】:

  • 你可以在复选框上使用 setOnCheckedChangeListener
  • 你已经有了可用的位置,你想对 setOnClickListener 上那个位置的元素做一些操作吗?我建议你使用 setOnCheckedChangeListener 而不是点击监听器。这里到底是什么问题。能说清楚一点吗?
  • 有文本视图和复选框。如果我选择第 4 个复选框,它应该给出第 4 个位置的文本。

标签: android listview checkbox


【解决方案1】:

列表视图项内的任何可点击视图都会窃取列表视图 onItemClickListener 点击。

如果你想在你的复选框上捕获检查事件,你应该使用 CompoundButton.OnCheckedChangeListener 而不是 View.OnClickListener。

由于 ListView 上的 convertView 是可重复使用的,因此您必须意识到您的数据将不准确。您必须创建一个数据集来保存您想要保留的值。

此代码来自您的适配器

public View getView(final int position, View convertView, ViewGroup parent) {
        Log.d("getview:", "position=" + position);
        vi = convertView;
        final ViewHolder holder;

        if (convertView == null) {

            vi = inflater.inflate(R.layout.add_members_list_item, null);
            holder = new ViewHolder();

            holder.Name = (TextView) vi.findViewById(R.id.Name);
            holder.UserId_Fk = (TextView) vi.findViewById(R.id.CusId_Fk);
            holder.chkbox = (CheckBox) vi.findViewById(R.id.chkbox);

            vi.setTag(holder);
        } else {

            holder = (ViewHolder) vi.getTag();

        }
        if (data.size() <= 0) {

            vi.setVisibility(View.GONE);

        } else {

            tempValues = null;
            tempValues = (ItemsModel) data.get(position);

            holder.Name.setText(tempValues.getItemName().toString());
            holder.UserId_Fk.setText(tempValues.getUserId_Fk().toString());

            holder.chkbox.setChecked(checkedHolder[position]);

            holder.chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    checkedHolder[position] = isChecked;
                }
            });
        }
        return vi;
    }

    public boolean[] checkedHolder;

    private void createCheckedHolder() {
        checkedHolder = new boolean[getCount()];
    }

在适配器的构造函数上调用 createCheckedHolder。而如果要获取checked的值,可以从checkedHolder获取

从checkedHolder中,您可以获取用户选择的任何项目的位置,然后您可以从您的活动中调用以下代码

private ArrayList<String> getSelectedNames(){
List<String> names = new ArrayList<String>();
for (int i = 0; i < adapter.getCount(); i++) {
                if(adapter.checkedHolder[i]){
                    //get all name values that checked by user
                    names.get(i).add(yourDataSet.getItemName().toString());
                }
            }
return names
}

【讨论】:

  • 你可以更新 list.setOnItemClickListener 它救了我的命
  • 正如我所说,如果您在列表项上添加任何可点击视图,您的 list.setOnItemClickListener 将不起作用,因为任何可点击视图都会窃取点击
  • 作为替代方案,您可以使用图像视图更改复选框,然后您可以使用 list.setOnItemClickListener 中禁用或启用复选框的图像更改该图像视图的图像
  • 另一种选择,您可以在 XML 文件中为复选框设置 android:clickable="false" android:focusable="false",然后手动调用 ((CheckBox) view.findViewById(R.id .chkbox)).setChecked(!((CheckBox) view.findViewById(R.id.chkbox)).getValue());在你的 list.setOnItemClickListener
  • 07-10 18:14:49.617:E/AndroidRuntime(23852):java.lang.RuntimeException:无法启动活动 ComponentInfo{Add_members}:java.lang.NullPointerException:尝试调用虚拟方法'int abc.adapter.Add_member_adapter.getCount()' 在空对象引用上
【解决方案2】:

查看我的代码。我正在使用这种方式从 listview 获取选中的项目:

public class MovieAdapter extends ArrayAdapter<MovieVO>{

    Context context;
    List<MovieVO> movieList;
    public MovieAdapter(Context context, int resource, List<MovieVO> objects) {
        super(context, resource, objects);
        this.context = context;
        movieList = objects;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_row, null);
        TextView tvMovieName = (TextView) convertView.findViewById(R.id.tvMovieName);
        TextView tvRating = (TextView) convertView.findViewById(R.id.tvRating);
        TextView tvGenre = (TextView) convertView.findViewById(R.id.tvGenre);
        TextView tvYear = (TextView) convertView.findViewById(R.id.tvYear);
        ImageView ivImage = (ImageView) convertView.findViewById(R.id.ivImage);
        CheckBox cbSelect = (CheckBox) convertView.findViewById(R.id.cbSelect);

        if(movieList.get(position).isSelected())
        {
            cbSelect.setChecked(true);
        }
        else
        {
            cbSelect.setChecked(false);
        }

        cbSelect.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    movieList.get(position).setSelected(true);
                }
                else
                {
                    movieList.get(position).setSelected(false);
                }
            }
        });

        tvMovieName.setText(movieList.get(position).getName());
        tvRating.setText(movieList.get(position).getRating());
        tvGenre.setText(Arrays.toString(movieList.get(position).getGenre()).replace("[", "").replace("]", ""));
        tvYear.setText(movieList.get(position).getYear());
        Picasso.with(context).load(movieList.get(position).getImageUrl()).into(ivImage);
        return convertView;
    }

在这里,我根据项目检查和取消检查添加真或假值。当您想要从列表中选择所有值时,只需迭代列表并检查真假值。

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 2012-06-10
    • 2017-01-03
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多