一个ListView行内观活动 [英] View Events inside a ListView Row

查看:173
本文介绍了一个ListView行内观活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用自定义行布局的listactivity。布局包括2个标签,一个ImageView的和一个复选框。

Hey guys, I have a listactivity that uses a custom row layout. The layout consists of 2 labels, a imageview and a Checkbox.

我想,当复选框被选中火的监听器。监听我写的作品,但不是射击对个人行了,它会在listactivity每一行。就像如果我查一下我的第一行的复选框,对话框将打开并正常工作,但第二,第三和第四行也将火。

I'm trying to fire a listener when the Checkbox is checked. The listener I wrote works, but instead of firing for the individual row, it fires for every single row in the listactivity. Like if I check the checkbox in my first row, the dialog will open and work correctly, however the 2nd, 3rd and 4th rows will also "fire".

下面是我的code的适当区域:

Here's the appropriate area of my code:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }
    final item o = items.get(position);
    if (o != null) {
        TextView tt = (TextView) v.findViewById(R.id.name);
        TextView bt = (TextView) v.findViewById(R.id.game);
        CheckBox cb = (CheckBox) v.findViewById(R.id.caught);
        if (cb != null && o.getStatus()) {
            cb.setChecked(true);
        } else {
            cb.setChecked(false);
        }
        if (tt != null) {
            tt.setText(o.getName());
        }
        if (bt != null && o.getStatus()) {
            bt.setText("Game: " + o.getGame());
        }

        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                o.setStatus(isChecked);
                if (isChecked) {
                AlertDialog.Builder builder2 = new AlertDialog.Builder(
                        context);
                builder2.setTitle("What game are we talkin gabout?");
                builder2.setItems(Checklist.GAMES,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int item) {
                                Toast.makeText(context,
                                        Checklist.GAMES[item],
                                        Toast.LENGTH_SHORT).show();
                                o.setGame(Checklist.GAMES[item]);
                                o.setStatus(true);
                                me.notifyDataSetChanged();
                            }
                        });
                builder2.show();
                } else {
                    o.setGame("");
                    o.setStatus(false);
                    me.notifyDataSetChanged();
                }
            }
        });
    }
    return v;

}

有没有更合适的地方建立我的复选框听众?

Is there a more appropriate place to create my listener for the checkbox?

推荐答案

我认为这不是一个好soloution每个视图与值更新时间assing新OnCheckedChangeListener。这将是最好只有一个时间设置一个监听器哪里在这个新的观点得到inflatet角度的视图。您可以通过将它变成CB的标签(setTag(..)),使其可用于监听邻对象。需要注意的是onCheckedChanged事件还激发当您通过cb.setChecked()设置CB的状态。

I think it's not a good soloution to assing a new OnCheckedChangeListener each time a view is updated with values. It would be better setting a listener only one time to a view at the point where this new view gets inflatet. You can make o-Object available for the listener by putting it into cb's tag (setTag(..)). Note that the onCheckedChanged event also fires when you set CB's state by cb.setChecked().

例如:

CheckBox cb = null;
if (v == null) {
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    v = vi.inflate(R.layout.row, null);
    cb = (CheckBox) v.findViewById(R.id.caught);
    // set a listener
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            item o = (item) buttonView.getTag();
            // show your dialog
        }
    });
}

item o = items.get(position);
if (o != null) {
    TextView tt = (TextView) v.findViewById(R.id.name);
    TextView bt = (TextView) v.findViewById(R.id.game);
    cb = (CheckBox) v.findViewById(R.id.caught);
    cb.setTag(o);
    // set checked state & text
    // ...
}

这篇关于一个ListView行内观活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆