0

onClickメソッド内で非final変数を参照できないことはよく知っていますが、現在直面している問題をどのように解決するかを知りたいと思っています。

ArrayAdapterがあります。ユーザーがチェックボックスAsyncTaskを押すと、チェックボックスがオンになっているかどうかに応じて、ユーザーは自分自身をキューにサブスクライブまたはサブスクライブ解除します。

このステータスをtxtStatusTextViewのテキストの各項目に反映させたいです。チェックボックスのステータスに応じて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;
}
4

1 に答える 1

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;
}
于 2012-04-11T07:37:08.853 に答える