【问题标题】:In Custom List view check box is unchecked when I scrolling在自定义列表视图中,我滚动时未选中复选框
【发布时间】:2014-06-17 06:32:09
【问题描述】:

我知道这个问题已经被问了一遍又一遍,但我仍然无法找到有用的建议。当我滚动列表视图时,复选框被取消选中。当特定项目时,我正在使用 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;
    }

}

【问题讨论】:

标签: android checkbox android-listview


【解决方案1】:

您的 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;
}

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

【讨论】:

  • 这样它对其他面临同样问题的人有用。
  • 你在哪里使用int getPosition = (Integer) buttonView.getTag(); ,当我滚动列表视图复选框项目检查不同项目时遇到问题
【解决方案2】:

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

Listview 被回收,因此您基本上需要将复选框的状态保存在某处。

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

当您的一个复选框被点击时,获取他的位置并在稀疏布尔数组中将元素(在此位置)设置为 true。

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

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

祝你好运!

【讨论】:

【解决方案3】:

中的buttonView
onCheckedChanged(CompoundButton buttonView, boolean isChecked) 

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

chkdelete.setTag(R.id.id_chkDelete);

最后你可以通过onCheckedChanged() as 中的标签访问视图的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));
            }

        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多