在滚动时,在“自定义列表视图”复选框中取消选中

时间:2014-06-17 06:32:09

标签: android checkbox android-listview

我知道这个问题一再被问到,但我仍然无法找到有用的建议。滚动列表视图时,复选框未选中。我正在使用Array List来存储特定项目时列表视图中所选项目的ID 未选中它将从列表视图中删除。

public class ManagePracticeLogAdapter extends BaseAdapter   
{

    Context context;
    LayoutInflater inflater;
    MenuItem menu,addlog;
    List<Integer> SelectedBox;
    ArrayList<HashMap<String, String>> data;
    HashMap<String, String> resultp = new HashMap<String, String>();

    public ManagePracticeLogAdapter(
        Context context, 
        ArrayList<HashMap<String, String>> arraylist, 
        MenuItem mymenu,
        MenuItem myaddlog)
    {
        this.context = context;
        data = arraylist;
        menu=mymenu;
        addlog=myaddlog;
    }

    @Override
    public int getCount() 
    {
        return data.size();
    }

    @Override
    public Object getItem(int position) 
    {
        return null;
    }

    @Override
    public long getItemId(int position)
    {
        return 0;
    }

    // Method  to display data of Produce log Activity in list view 
    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        // TODO Auto-generated method stub
        TextView datetime;
        TextView totminutes;
        TextView skills;
        TextView weather;
        final CheckBox chkdelete;


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

        View itemView = inflater.inflate(R.layout.logitem1, parent, false);
        // Get the position
        resultp = data.get(position);

        // Locate the TextViews in listview_item.xml
        datetime = (TextView) itemView.findViewById(R.id.id_datetime);
        totminutes = (TextView) itemView.findViewById(R.id.totminutes);
        skills= (TextView) itemView.findViewById(R.id.id_skills);
        weather=(TextView)itemView.findViewById(R.id.id_weather);

        chkdelete=(CheckBox)itemView.findViewById(R.id.id_chkDelete);

        // Capture position and set results to the TextViews
        datetime.setText(resultp.get("Skill_practice"));
        totminutes.setText(resultp.get("Day_minutes")+" min");
        skills.setText(resultp.get("Night_minutes"));
        weather.setText(resultp.get("Prac_Date"));
        String fontPath = "fonts/Roboto-Light.ttf";
        Typeface tf = Typeface.createFromAsset(context.getAssets(), fontPath);
        datetime.setTypeface(tf);
        totminutes.setTypeface(tf);
        skills.setTypeface(tf);
        weather.setTypeface(tf);



        SelectedBox = new ArrayList<Integer>();
        chkdelete.setOnCheckedChangeListener(new OnCheckedChangeListener() 
        {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            {
                if(SelectedBox.size()-1==0)
                {
                    menu.setVisible(false);
                    addlog.setVisible(true);
                }else
                {
                    addlog.setVisible(false);
                }
                if(isChecked)
                {
                    SelectedBox.add(buttonView.getId());
                    menu.setVisible(true);
                    addlog.setVisible(false);

                }else if(!isChecked)
                {

                    SelectedBox.remove(SelectedBox.indexOf(buttonView.getId()));

                }

            }
        });



        menu.setOnMenuItemClickListener(new OnMenuItemClickListener()
        {

            @Override
            public boolean onMenuItemClick(MenuItem item)
            {
                // TODO Auto-generated method stub

                if(!SelectedBox.isEmpty())
                {
                    Toast.makeText(context, "Menu option 4 added!", 
                        Toast.LENGTH_LONG).show();

                }

                return false;
            }
        });



        itemView.setOnClickListener(new OnClickListener() 
        {

            @Override
            public void onClick(View arg0)
            {
                Intent intent = new Intent(context,LogEdit.class);
                intent.putExtra("s11","Update Practice");
                context.startActivity(intent);

            }
        });
        return itemView;
    }

}

3 个答案:

答案 0 :(得分:2)

你的getView方法看起来应该是这样的

创建ViewHolder类

static class ViewHolder {
        TextView datetime;
        TextView totminutes;
        TextView skills;
        TextView weather;
        CheckBox chkdelete;
    }

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

    ViewHolder viewHolder = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        convertView = inflator.inflate(R.layout.logitem1, null);
        viewHolder = new ViewHolder();
        viewHolder.datetime = (TextView) convertView.findViewById(R.id.id_datetime);
        // do the same thing for other textviews and checkbox.
        viewHolder.chkdelete.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.

            }
        });
        convertView.setTag(viewHolder);
        convertView.setTag(R.id.id_datetime, viewHolder.datetime);
        // do the same for other textviews and checkbox
        } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.chkdelete.setTag(position); // This line is important.

    viewHolder.datetime.setText(resultp.get("Skill_practice"));
    // do the same for others

    return convertView;
}

您需要根据需要进行修改。此代码将解决滚动问题。

答案 1 :(得分:0)

您需要使用例如稀疏布尔数组。 https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M

Listview被回收,所以你基本上需要在某个地方保存你的复选框的状态。

Juste创建一个大小为[复选框数]的稀疏布尔数组。

单击其中一个复选框后,获取其位置并在稀疏布尔数组中将元素(在此位置)设置为true。

在创建视图中,如果稀疏布尔值为真,则将复选框设置为“启用”状态。

您应该使用视图持有者,而不是每次都创建新对象。

祝你好运!

答案 2 :(得分:0)

中的buttonView
onCheckedChanged(CompoundButton buttonView, boolean isChecked) 

指的是适配器的最后一项。这是因为适配器用于回收视图。要访问ID,请将其存储在标记中。

chkdelete.setTag(R.id.id_chkDelete);

最后,您可以通过onCheckedChanged()内的标记

来访问视图的ID
int checkBoxId=(int) view.getTag().toString();

最后,您的代码看起来像

    SelectedBox = new ArrayList<Integer>();
    chkdelete.setTag(R.id.id_chkDelete);
    chkdelete.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
        {
            int checkBoxId=(int) view.getTag().toString();
            if(SelectedBox.size()-1==0)
            {
                menu.setVisible(false);
                addlog.setVisible(true);
            }else
            {
                addlog.setVisible(false);
            }
            if(isChecked)
            {
                SelectedBox.add(checkBoxId);
                menu.setVisible(true);
                addlog.setVisible(false);
            }else if(!isChecked)
            {
                SelectedBox.remove(SelectedBox.indexOf(checkBoxId));
            }

        }
    });
相关问题