我有一个ListView
,并使用自定义适配器填充ListView
TextView
和Button
。我为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;
}
答案 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()
的评论。