【问题标题】:How do I set up a listener to a switch in my Custom listview?如何为自定义列表视图中的开关设置监听器?
【发布时间】:2012-04-03 15:11:09
【问题描述】:

我想为列表视图中每个项目中的每个开关设置一个单独的侦听器。我该怎么做呢?

在我的异步任务中调用的方法是 setQueues :

    private void setQueues(final JSONObject[] qInfo) 
{
    queues = new QueueItem[qInfo.length]; // QueueItem consists of a string(label) and a boolean(value)

    for(int i = 0; i < qInfo.length; i++)
    {
        queues[i] = new QueueItem();
        //final int ii = i;

        // Formatting the queue title
        String name = qInfo[i].optString("name").replace("-", " ");
        name = name.replace("_", " ");
        name = name.replace("ipinion", "");
        name = name.replace("  ", " ");
        name = capitalizeFirstLetters(name);
        queues[i].label = name;

        try {
            if(qInfo[i].getString("active").contains("1"))
            {
                Log.d("QBox", "Queue: Checkbox " + i + " : Checked TRUE");
                queues[i].value = true;
            }
            else
            {
                Log.d("QBox", "Queue Checkbox " + i + " : Checked FALSE");  
                queues[i].value = false;
            }
        } 
        catch (JSONException e) 
        {
            e.printStackTrace();
        }

    }

    lv.setAdapter(new QueueAdapter(getActivity(), 
            R.layout.queues_items, queues));
}

非常感谢任何帮助。我觉得我错过了一些非常明显的东西。

编辑:QueueAdapter 的 getView 方法:

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    QueueHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new QueueHolder();
        holder.queueswitch = (Switch)row.findViewById(R.id.queues_item_switch);
        holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_text);

        row.setTag(holder);
    }
    else
    {
    holder = (QueueHolder)row.getTag();
    }

    QueueItem queue = data[position];
    holder.txtLabel.setText(queue.label);
    holder.queueswitch.setChecked(queue.value);
    // Is this where you would set up your listener?    

    return row;
}

【问题讨论】:

    标签: android android-listview onclicklistener


    【解决方案1】:
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        QueueHolder holder = null;
    
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new QueueHolder();
            holder.queueswitch = (Switch)row.findViewById(R.id.queues_item_switch);
            /* TRY PUTTING IT HERE */
            holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_text);
    
            row.setTag(holder);
        }
        else
        {
        holder = (QueueHolder)row.getTag();
        }
    
        QueueItem queue = data[position];
        holder.txtLabel.setText(queue.label);
        holder.queueswitch.setChecked(queue.value);
        holder.queueswitch.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //DO SOMETHING
            }
        });
    
        return row;
    }
    

    这样就可以了!我不确定,但试着把它放在“/* TRY PUTTING IT HERE */”的位置,我不确定它是否会工作,但它会更好,因为 onClickListener 的启动只发生一次......

    【讨论】:

    • 是否可以从“这里”执行 AsyncTask ?
    • 一次。我想在执行任务时显示的进度条需要一个上下文。 getActivity() 在这里不起作用,因为 QueueAdapter 扩展了 ArrayAdapter。
    • 如果您的适配器在单独的文件中,请将活动或上下文放入适配器的构造函数中...如果它们在同一个文件中,您可以使用:'MyActivityName.this' 作为活动在您的适配器中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多