来自自定义ListAdapter的复选框未收到点击

时间:2014-03-21 10:43:52

标签: android listadapter

我有一个自定义ListAdapter,其元素由一个TextViewCheckBox组成。问题是复选框没有收到任何点击事件。

下面的适配器代码。

public DragNDropAdapter(Context context) {
        mViews = new View[mTexts.length];

        for (int i = 0; i < mViews.length; i++) {
            LinearLayout layout = new LinearLayout(context);

            TextView textView = new TextView(context);
            textView.setText(mTexts[i]);
            layout.addView(textView);

            CheckBox checkBoxView = new CheckBox(context);
            checkBoxView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    log("clicked"); //doesn't work
                }
            });
            layout.addView(checkBoxView);

            mViews[i] = layout;
        }
    }

public View getView(final int position, View convertView,
            ViewGroup parent) {
        return mViews[position];
    }

点击chechboxes时没有任何反应。但是当我转动屏幕并且所有内容都“自动重新创建”时,所有丢失的日志都会一起显示。

问题是,为什么以及为什么拒绝这些点击事件?

以前我喜欢它:

public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if (convertView == null) {
            LinearLayout layout = new LinearLayout(context);

            TextView textView = new TextView(context);
            textView.setText(mTexts[position]);
            layout.addView(textView);

            CheckBox checkBoxView = new CheckBox(context);
            checkBoxView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    log("clicked");//do work
                }
            });
            layout.addView(checkBoxView);

            convertView = layout;
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        //(...) setting holder's info

        return convertView;
    }

点击事件已正确传递。有什么不同?我不能使用第二种方法,因为它是一个拖放适配器,我无法找到跟踪复选框状态的好方法。

总结一下 - 为什么点击事件在第一种方法中不起作用,但在第二种方法中起作用?

3 个答案:

答案 0 :(得分:0)

使用

CheckBox checkBoxView = new CheckBox(context); 

而不是

CheckBox checkBoxView = new CheckBox(mContext);

人们已经说过 - 使用OnCheckedChangedListener

答案 1 :(得分:0)

以下是我的做法(假设您从持有人那里获得了正确的复选框):

holder.(checkboxNameInTheHolder).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // Your stuff
 }
});

希望有所帮助。 问候。

答案 2 :(得分:0)

更改

        CheckBox checkBoxView = new CheckBox(context);
        checkBoxView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                log("clicked");//do work
            }
        });
        layout.addView(checkBoxView);

        CheckBox checkBoxView = new CheckBox(context);
        layout.addView(checkBoxView); 
        checkBoxView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                log("clicked");//do work
            }
        });

OR(推荐):

 checkBoxView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 @Override
 public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
 if(isChecked)
 log("clicked");//do work
}