虽然我很清楚我无法在onClick方法中引用非final变量,但我很想知道如何解决我目前面临的问题。
我有一个ArrayAdapter。如果用户按下AsyncTask复选框,用户可以订阅或取消订阅队列,具体取决于是否选中了复选框。
我希望此状态反映在txtStatus TextView文本中的每个项目中。如何根据复选框的状态设置TextView的文本?
以下是我的getView方法代码的一部分:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
final CheckBox queueCBox;
userControl = new UserController(context);
final String queueName = data[position].label;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
final QueueHolder holder = new QueueHolder();
holder.queuecbox = (CheckBox)row.findViewById(R.id.queues_item_checkbox);
queueCBox = (CheckBox)row.findViewById(R.id.queues_item_checkbox);
holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_label);
holder.txtStatus = (TextView)row.findViewById(R.id.queues_item_status);
holder.queuecbox.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
final String[] param = new String[1];
param[0] = queueName;
if(queueCBox.isChecked())
{
holder.txtStatus.setText("Tilmeldt");
Log.d("ClickTest","SWITCH ON");
new JoinQueueTask().execute(param);
}
else
{
holder.txtStatus.setText("Frameldt");
Log.d("ClickTest","SWITCH OFF");
new LeaveQueueTask().execute(param);
}
}
});
row.setTag(holder);
}
else
{
final QueueHolder holder = (QueueHolder)row.getTag();
}
QueueItem queue = data[position];
String name = queue.label.replace("-", " ");
holder.txtLabel.setText(name); // holder cannot be resolved
holder.queuecbox.setChecked(queue.value); // holder cannot be resolved
return row;
}
答案 0 :(得分:6)
保持你的持有人的方式。只是为了设置onClickListener,尝试这样做,
QueueHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new QueueHolder();
holder.queuecbox = (CheckBox)row.findViewById(R.id.queues_item_checkbox);
queueCBox = (CheckBox)row.findViewById(R.id.queues_item_checkbox);
holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_label);
holder.txtStatus = (TextView)row.findViewById(R.id.queues_item_status);
row.setTag(holder);
}
else
{
holder = (QueueHolder)row.getTag();
}
QueueItem queue = data[position];
String name = queue.label.replace("-", " ");
holder.txtLabel.setText(name); // holder cannot be resolved
holder.queuecbox.setChecked(queue.value); // holder cannot be resolved
final QueueHolder fianlHolder = holder;
finalHolder.queuecbox.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
final String[] param = new String[1];
param[0] = queueName;
if(queueCBox.isChecked())
{
finalHolder.txtStatus.setText("Tilmeldt");
Log.d("ClickTest","SWITCH ON");
new JoinQueueTask().execute(param);
}
else
{
finalHolder.txtStatus.setText("Frameldt");
Log.d("ClickTest","SWITCH OFF");
new LeaveQueueTask().execute(param);
}
}
});
return row;
}