我怎样才能Android的列表视图中选择项目要记住自己的状态,关闭屏幕? [英] how can i get android list view selector items to remember their state off screen?

查看:111
本文介绍了我怎样才能Android的列表视图中选择项目要记住自己的状态,关闭屏幕?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已创建自定义列表视图,它具有两个箭头(上/下进行表决)上的每一行的左侧。使用选择我已经能够相应地改变箭头的图像(彩色),并更新了票。我的问题是,如果我点击投票了,例如,当我向下滚动,足以使该列表项我投上熄灭它重置为原始未选中状态/图像在屏幕上。

这是我获取视图的方法

 公开查看getView(最终诠释的立场,观点convertView,父母的ViewGroup)
    {
        //创建我们前面定义的ViewHolder。
        最后ViewHolder持有人=新ViewHolder();

        //创建LayoutInflator的充气行布局。
        LayoutInflater充气=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //夸大我们前面定义的行布局。
        convertView = inflator.inflate(R.layout.partylist,NULL);

        //设置意见到ViewHolder。
        holder.title =(TextView中)convertView.findViewById(R.id.title);
        holder.voteUp =(ImageView的)convertView.findViewById(R.id.vote_up_image);
        holder.voteUp.setTag(位置);
        holder.voteDown =(ImageView的)convertView.findViewById(R.id.vote_down_image);
        holder.voteDown.setTag(位置);
        holder.votes =(TextView中)convertView.findViewById(R.id.votes);

        //定义onClickListener为ImageView的。
        holder.voteUp.setOnClickListener(新OnClickListener()
        {
            @覆盖
            公共无效的onClick(视图v)
            {
                如果(v.isSelected()){
                    v.setSelected(假);
                    holder.votes.setText(将String.valueOf((list.get(位置).votes)));
                } 其他 {
                    如果(holder.voteDown.isSelected()){
                    v.setSelected(真正的);
                    holder.voteDown.setSelected(假);
                    holder.votes.setText(将String.valueOf((list.get(位置).votes + 1)));
                    }其他{
                        v.setSelected(真正的);
                    }
                }

                //Toast.makeText(PartyActivity.this,图片来源行+位置+是pressed+ list.get(位置).title伪,Toast.LENGTH_LONG).show();
            }
        });

        holder.voteDown.setOnClickListener(新OnClickListener()
        {
            @覆盖
            公共无效的onClick(查看W)
            {
                如果(w.isSelected()){
                    w.setSelected(假);
                    holder.votes.setText(将String.valueOf((list.get(位置).votes)));
                } 其他 {
                    如果(holder.voteUp.isSelected()){
                    w.setSelected(真正的);
                    holder.voteUp.setSelected(假);
                    holder.votes.setText(将String.valueOf((list.get(位置).votes-1)));
                    }其他{
                        w.setSelected(真正的);
                    }
                }

                //Toast.makeText(PartyActivity.this,图片来源行+位置+是pressed+ list.get(位置).title伪,Toast.LENGTH_LONG).show();
            }
        });


        //设置数据到了ViewHolder。
        holder.title.setText(list.get(位置).title伪);
        holder.votes.setText(将String.valueOf(list.get(位置).votes));
        //返回的行视图。
        返回convertView;
    }
}
 

解决方案

所以,我理解了它自己。它是由教程一个可怕的理解造成的。

我的对象传递给我的自定义适配器和所有我所要做的就是创建对象里面的几个布尔变量来存储是否复选框/选择器中的每一行上选择,然后适当地设置这些变量,当图像被点击。

我的继承人新getview()的人谁需要帮助

 公开查看getView(最终诠释的立场,观点convertView,父母的ViewGroup)
    {
        //创建我们前面定义的ViewHolder。
        最后ViewHolder持有人=新ViewHolder();

        //创建LayoutInflator的充气行布局。
        LayoutInflater充气=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //夸大我们前面定义的行布局。
        convertView = inflator.inflate(R.layout.partylist,NULL);

        //设置意见到ViewHolder。
        holder.title =(TextView中)convertView.findViewById(R.id.title);
        holder.voteUp =(复选框)convertView.findViewById(R.id.vote_up_image);
        holder.voteUp.setTag(位置);
        holder.voteDown =(复选框)convertView.findViewById(R.id.vote_down_image);
        holder.voteDown.setTag(位置);
        holder.votes =(TextView中)convertView.findViewById(R.id.votes);




        //定义onClickListener为ImageView的。

        holder.voteUp.setOnCheckedChangeListener(新OnCheckedChangeListener()
        {
            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked)
            {
                如果(holder.voteUp.isSelected()){
                    holder.voteUp.setSelected(假);
                    list.get(位置).UP = FALSE;
                    holder.votes.setText(将String.valueOf((list.get(位置).votes)));
                } 其他 {
                    如果(holder.voteDown.isSelected()){
                    holder.voteUp.setSelected(真正的);
                    holder.voteDown.setSelected(假);
                    list.get(位置).UP = TRUE;
                    list.get(位置).Down = FALSE;
                    holder.votes.setText(将String.valueOf((list.get(位置).votes + 1)));
                    }其他{
                        holder.voteUp.setSelected(真正的);
                        list.get(位置).UP = TRUE;
                        holder.votes.setText(将String.valueOf((list.get(位置).votes + 1)));
                    }

            }}
        });

        holder.voteDown.setOnCheckedChangeListener(新OnCheckedChangeListener()
        {
            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked)
            {// Toast.makeText(PartyActivity.this,图片来源行+位置+是pressed+ list.get(位置).title伪,Toast.LENGTH_LONG).show();
                如果(holder.voteDown.isSelected()){
                    holder.voteDown.setSelected(假);
                    list.get(位置).Down = FALSE;
                    holder.votes.setText(将String.valueOf((list.get(位置).votes)));
                } 其他 {
                    如果(holder.voteUp.isSelected()){
                    holder.voteDown.setSelected(真正的);
                    holder.voteUp.setSelected(假);
                    list.get(位置).Down = TRUE;
                    list.get(位置).UP = FALSE;
                    holder.votes.setText(将String.valueOf((list.get(位置).votes-1)));
                    }其他{
                        holder.voteDown.setSelected(真正的);
                        list.get(位置).Down = TRUE;
                        holder.votes.setText(将String.valueOf((list.get(位置).votes-1)));
                    }

            }}
        });


        //设置数据到了ViewHolder。
        holder.title.setText(list.get(位置).title伪);
        holder.votes.setText(将String.valueOf(list.get(位置).votes));
        holder.voteUp.setChecked(list.get(位置).UP);
        holder.voteDown.setChecked(list.get(位置).Down);
        //返回的行视图。
        返回convertView;
    }
 

I have created a custom list view that has two arrows (up/down for voting) on the left side of each row. Using selectors I have been able to change the image(colour) of the arrows and update the votes accordingly. My problem is that if I click vote up for example, as soon as i scroll down far enough so that the list item i voted on goes off the screen it resets to the original un-checked state/image.

here's my get view method

 public View getView(final int position, View convertView, ViewGroup parent)
    {
        //creating the ViewHolder we defined earlier.
        final ViewHolder holder = new ViewHolder(); 

        //creating LayoutInflator for inflating the row layout.
        LayoutInflater inflator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //inflating the row layout we defined earlier.
        convertView = inflator.inflate(R.layout.partylist, null);

        //setting the views into the ViewHolder.
        holder.title = (TextView) convertView.findViewById(R.id.title);
        holder.voteUp = (ImageView) convertView.findViewById(R.id.vote_up_image);
        holder.voteUp.setTag(position);
        holder.voteDown = (ImageView) convertView.findViewById(R.id.vote_down_image);
        holder.voteDown.setTag(position);
        holder.votes = (TextView) convertView.findViewById(R.id.votes);

        //define an onClickListener for the ImageView.
        holder.voteUp.setOnClickListener(new OnClickListener() 
        {           
            @Override
            public void onClick(View v) 
            { 
                if (v.isSelected()){
                    v.setSelected(false);
                    holder.votes.setText(String.valueOf((list.get(position).votes)));
                } else {
                    if (holder.voteDown.isSelected()){
                    v.setSelected(true);
                    holder.voteDown.setSelected(false);
                    holder.votes.setText(String.valueOf((list.get(position).votes+1)));
                    }else{
                        v.setSelected(true);
                    }
                }

                //Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show();
            }
        });

        holder.voteDown.setOnClickListener(new OnClickListener() 
        {           
            @Override
            public void onClick(View w) 
            { 
                if (w.isSelected()){
                    w.setSelected(false);
                    holder.votes.setText(String.valueOf((list.get(position).votes)));
                } else {
                    if (holder.voteUp.isSelected()){
                    w.setSelected(true);
                    holder.voteUp.setSelected(false);
                    holder.votes.setText(String.valueOf((list.get(position).votes-1)));
                    }else{
                        w.setSelected(true);
                    }
                }

                //Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show();
            }
        });


        //setting data into the the ViewHolder.
        holder.title.setText(list.get(position).title);
        holder.votes.setText(String.valueOf(list.get(position).votes));
        //return the row view.
        return convertView;
    }
}

解决方案

So I figured it out myself. It was caused by a terrible understanding of tutorials.

I pass an object to my custom adapter and all I had to do was create a few boolean variables inside the object to store whether the checkbox/selectors were selected on each row and then set those variables appropriately when the images were clicked.

heres my new getview() for anyone who needs help

public View getView(final int position, View convertView, ViewGroup parent)
    {
        //creating the ViewHolder we defined earlier.
        final ViewHolder holder = new ViewHolder(); 

        //creating LayoutInflator for inflating the row layout.
        LayoutInflater inflator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //inflating the row layout we defined earlier.
        convertView = inflator.inflate(R.layout.partylist, null);

        //setting the views into the ViewHolder.
        holder.title = (TextView) convertView.findViewById(R.id.title);
        holder.voteUp = (CheckBox) convertView.findViewById(R.id.vote_up_image);
        holder.voteUp.setTag(position);
        holder.voteDown = (CheckBox) convertView.findViewById(R.id.vote_down_image);
        holder.voteDown.setTag(position);
        holder.votes = (TextView) convertView.findViewById(R.id.votes);




        //define an onClickListener for the ImageView.

        holder.voteUp.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
                if (holder.voteUp.isSelected()){
                    holder.voteUp.setSelected(false);
                    list.get(position).Up=false;
                    holder.votes.setText(String.valueOf((list.get(position).votes)));
                } else {
                    if (holder.voteDown.isSelected()){
                    holder.voteUp.setSelected(true);
                    holder.voteDown.setSelected(false);
                    list.get(position).Up=true;
                    list.get(position).Down=false;
                    holder.votes.setText(String.valueOf((list.get(position).votes+1)));
                    }else{
                        holder.voteUp.setSelected(true);
                        list.get(position).Up=true;
                        holder.votes.setText(String.valueOf((list.get(position).votes+1)));
                    }

            }}
        });

        holder.voteDown.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {// Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show();
                if (holder.voteDown.isSelected()){
                    holder.voteDown.setSelected(false);
                    list.get(position).Down=false;
                    holder.votes.setText(String.valueOf((list.get(position).votes)));
                } else {
                    if (holder.voteUp.isSelected()){
                    holder.voteDown.setSelected(true);
                    holder.voteUp.setSelected(false);
                    list.get(position).Down=true;
                    list.get(position).Up=false;
                    holder.votes.setText(String.valueOf((list.get(position).votes-1)));
                    }else{
                        holder.voteDown.setSelected(true);
                        list.get(position).Down=true;
                        holder.votes.setText(String.valueOf((list.get(position).votes-1)));
                    }

            }}
        }); 


        //setting data into the the ViewHolder.
        holder.title.setText(list.get(position).title);
        holder.votes.setText(String.valueOf(list.get(position).votes));
        holder.voteUp.setChecked(list.get(position).Up);
        holder.voteDown.setChecked(list.get(position).Down);
        //return the row view.
        return convertView;
    }

这篇关于我怎样才能Android的列表视图中选择项目要记住自己的状态,关闭屏幕?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆