Android列表视图按钮从上到下滚动时文本颜色会发生变化吗?

时间:2015-06-19 05:44:30

标签: android android-listview

我有一个ListView,并使用自定义适配器填充ListView TextViewButton。我为Button生成了点击事件自定义适配器。在该点击事件中,我正在尝试更改按钮文本和颜色,到此处工作正常,但当我向上和向下滚动ListView其他Button更改的文本颜色时。从过去的几天开始就停在这里......

这是我迄今为止尝试过的一些代码

@Override
    public View getView(final int position, View convertView, ViewGroup parent) 
    {
        View v=convertView;
        final ViewHolder holder;
        if(convertView ==null)
        {
            convertView = mInlfater.inflate(R.layout.attendancelistview,null);
            holder = new ViewHolder();
            holder.b1 = (Button)convertView.findViewById(R.id.row3);
            holder.tv1 = (TextView)convertView.findViewById(R.id.row1);
            holder.tv2 = (TextView)convertView.findViewById(R.id.row2);
            convertView.setTag(holder);
        }
        else
        {
            holder =(ViewHolder) convertView.getTag();
        }
        //List<StudentData> data = list.get(position).Rno;
        holder.tv1.setText(String.valueOf(list.get(position).Rno));
        holder.tv2.setText(list.get(position).StudentName);
        holder.b1.setText(list.get(position).Attendance);
        holder.b1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v)
            {
                if(holder.b1.getText().equals("Present"))
                {
                    holder.b1.setText("Absent");
                    //list.get(position).put("Attendance", "Absent");

                    holder.b1.setTextColor(Color.RED);
                }
                else if(holder.b1.getText().equals("Absent"))
                {
                    holder.b1.setText("Present");
                    //list.get(position).put("Attendance", "Present");
                    holder.b1.setTextColor(Color.GREEN);
                }
                String rno1=  String.valueOf(holder.tv1.getText());
                name=String.valueOf(holder.tv2.getText());
            }

        });
        return convertView;
    }
    static class ViewHolder
    {
        Button b1;
        TextView tv1,tv2,tv3;
    }

3 个答案:

答案 0 :(得分:1)

如果holder.b1按钮文本正在更改,那么原因是您没有正确处理getView。

我想这会返回一些整数id

list.get(position).Rno

所以你需要将这个id存储在一些arraylist中,例如

//Declare this outside of getView().   
 ArrayList<Integer> your_number = new ArrayList();

点击按钮

holder.b1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v)
            {
                if(holder.b1.getText().equals("Present"))
                {
                    holder.b1.setText("Absent");
                    //list.get(position).put("Attendance", "Absent");

                    holder.b1.setTextColor(Color.RED);
your_number.add(list.get(position).Rno);
                }
                else if(holder.b1.getText().equals("Absent"))
                {
                    holder.b1.setText("Present");
                    //list.get(position).put("Attendance", "Present");
                    holder.b1.setTextColor(Color.GREEN);
your_number.remove(list.get(position).Rno);
                }
                String rno1=  String.valueOf(holder.tv1.getText());
                name=String.valueOf(holder.tv2.getText());
            }

        });

最后在你的getView()

if (your_number.contains(list.get(position).Rno)){
//set your text
}else{
//Set your text
}

答案 1 :(得分:0)

您需要跟踪您单击的按钮,并相应地设置颜色。

请记住,您的视图正在被重复使用,因此如果您在下次重复使用视图时有一个红色按钮(通过向上/向下滚动),它仍然会显示为红色。

使用列表或某种容器来存储点击的项目,并在getView中设置正确的值。

答案 2 :(得分:0)

如果您更改一个项目的颜色,则多次使用相同的视图,它将应用于具有相同引用的另一个项目。要在单击按钮时避免这种情况,请获取项目的位置,并在getView()方法中根据位置更改文本颜色。

修改

getView()

之前,将这些行添加到holder.b1.setOnClickListener()方法中
if(holder.b1.getText().equals("Present"))
 {
      holder.b1.setTextColor(Color.GREEN);
 }
 else if(holder.b1.getText().equals("Absent"))
 {
      holder.b1.setTextColor(Color.RED);
 }

我没有执行您的代码...但它可能有用,并且还会删除list.get(position).put("Attendance", "Absent");方法中行list.get(position).put("Attendance", "Present");onClick()的评论。