在自定义列表视图复选框被选中,当我滚动当我、自定义、视图、复选框

2023-09-03 22:50:32 作者:以为姐姐是我的唯一

我知道这个问题已经被问了一遍又一遍,但还是我没能找到一个有帮助的建议。复选框被选中获得当我滚动列表视图。我使用数组列表存储选定项的ID列表视图特别是当项目 未被选中它是从列表视图中删除。

 公共类ManagePracticeLogAdapter扩展了BaseAdapter
{

    上下文语境;
    LayoutInflater充气;
    菜单项的菜单,addlog;
    名单<整数GT; SelectedBox;
    ArrayList的< HashMap的<字符串,字符串>>数据;
    HashMap的<字符串,字符串> resultp =新的HashMap<字符串,字符串>();

    公共ManagePracticeLogAdapter(
        上下文的背景下,
        ArrayList的< HashMap的<字符串,字符串>> ArrayList中,
        菜单项MyMenu菜单,
        菜单项myaddlog)
    {
        this.context =背景;
        数据=数组列表;
        菜单= MyMenu菜单;
        addlog = myaddlog;
    }

    @覆盖
    公众诠释getCount将()
    {
        返回data.size();
    }

    @覆盖
    公共对象的getItem(INT位置)
    {
        返回null;
    }

    @覆盖
    众长getItemId(INT位置)
    {
        返回0;
    }

    //方法,以显示生成日志活动在列表视图中的数据
    @覆盖
    公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup)
    {
        // TODO自动生成方法存根
        TextView的日期时间;
        TextView的totminutes;
        TextView的技能;
        TextView的天气;
        最后复选框chkdelete;


        充气=(LayoutInflater)上下文
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        查看ItemView控件= inflater.inflate(R.layout.logitem1,父母,假);
        //获取位置
        resultp = data.get(位置);

        //定位在listview_item.xml的TextViews
        日期时间=(TextView中)itemView.findViewById(R.id.id_datetime);
        totminutes =(TextView中)itemView.findViewById(R.id.totminutes);
        技能=(TextView中)itemView.findViewById(R.id.id_skills);
        天气=(TextView中)itemView.findViewById(R.id.id_weather);

        chkdelete =(复选框)itemView.findViewById(R.id.id_chkDelete);

        //捕捉位置,并设置结果的TextViews
        datetime.setText(resultp.get(Skill_practice));
        totminutes.setText(resultp.get(Day_minutes)+分);
        skills.setText(resultp.get(Night_minutes));
        weather.setText(resultp.get(Prac_Date));
        字符串字体路径=字体/ Roboto-Light.ttf;
        字样TF = Typeface.createFromAsset(context.getAssets(),字体路径);
        datetime.setTypeface(TF);
        totminutes.setTypeface(TF);
        skills.setTypeface(TF);
        weather.setTypeface(TF);



        SelectedBox =新的ArrayList<整数GT;();
        chkdelete.setOnCheckedChangeListener(新OnCheckedChangeListener()
        {

            @覆盖
            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked)
            {
                如果(SelectedBox.size() -  1 == 0)
                {
                    menu.setVisible(假);
                    addlog.setVisible(真正的);
                }其他
                {
                    addlog.setVisible(假);
                }
                如果(器isChecked)
                {
                    SelectedBox.add(buttonView.getId());
                    menu.setVisible(真正的);
                    addlog.setVisible(假);

                }否则,如果(!器isChecked)
                {

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

                }

            }
        });



        menu.setOnMenuItemClickListener(新OnMenuItemClickListener()
        {

            @覆盖
            公共布尔onMenuItemClick(菜单项项)
            {
                // TODO自动生成方法存根

                如果(!SelectedBox.isEmpty())
                {
                    Toast.makeText(背景下,菜单选项4加!
                        Toast.LENGTH_LONG).show();

                }

                返回false;
            }
        });



        itemView.setOnClickListener(新OnClickListener()
        {

            @覆盖
            公共无效的onClick(查看arg0中)
            {
                意向意图=新的意图(背景下,LogEdit.class);
                intent.putExtra(S11,更新实践);
                context.startActivity(意向);

            }
        });
        返回ItemView控件;
    }

}
 

解决方案

您getView方法应该是这样的。

创建ViewHolder类

 静态类ViewHolder {
        TextView的日期时间;
        TextView的totminutes;
        TextView的技能;
        TextView的天气;
        复选框chkdelete;
    }

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){

    ViewHolder viewHolder = NULL;
    如果(convertView == NULL){
        LayoutInflater充气= context.getLayoutInflater();
        convertView = inflator.inflate(R.layout.logitem1,NULL);
        viewHolder =新ViewHolder();
        viewHolder.datetime =(TextView中)convertView.findViewById(R.id.id_datetime);
        //做同样的事情,其他textviews和复选框。
        viewHolder.chkdelete.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){

            @覆盖
            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
                INT为getPosition =(整数)buttonView.getTag(); //下面就让我们看,我们已经为使用setTag的复选框的位置。

            }
        });
        convertView.setTag(viewHolder);
        convertView.setTag(R.id.id_datetime,viewHolder.datetime);
        //其他textviews和复选框做同样的
        } 其他 {
        viewHolder =(ViewHolder)convertView.getTag();
    }
    viewHolder.chkdelete.setTag(位置); //这行是很重要的。

    viewHolder.datetime.setText(resultp.get(Skill_practice));
    //做同样为他人

    返回convertView;
}
 
怎样做Word文档里面的复选框里的勾选项

您需要根据自己的需要进行修改。这code将解决在滚动你的问题。

I know that this question has been asked over and over again but still I've not been able to find a helpful suggestion. Check box is getting unchecked when I scroll the List view. I am using Array List to store id of a selected item in the list view when particular item is unchecked it is removed from List view.

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

}

解决方案

Your getView method should look like this

Create a ViewHolder class

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

You need to modify it according to your needs. This code will solve your problem on scroll.