自定义适配器不显示正确信息

时间:2013-12-05 14:48:52

标签: android android-listview adapter

我有一个自定义适配器,如下所示,

public class CustomAdapter extends ArrayAdapter<String> {

private Activity activity;
private List<String> items;
private LayoutInflater inflater = null;

public CustomAdapter(Activity a, int resource, List<String> i) {
    super(a, resource, i);
    activity = a;
    items = i;
    inflater = (LayoutInflater) a
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

    if (vi == null) {
        vi = inflater.inflate(
                android.R.layout.simple_list_item_multiple_choice, parent,
                false);
    }

    final CheckedTextView checkbox = (CheckedTextView) vi
            .findViewById(android.R.id.text1);
    checkbox.setText(items.get(position));
    Log.d("test", "testing");

    checkbox.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            if (!checkbox.isChecked()) {
                checkbox.setChecked(true);
                Log.d("Test", "checked");

                if (checkbox.isChecked()) {
                    checkbox.setChecked(false);
                    Log.d("test", "unchecked");
                }
            }
        }
    }); 

但是,我的列表现在只显示每行的复选框,同时应显示文本视图和复选框。此外,无论我触摸复选框还是listitem本身,我的onClickListener都能正常工作。只有在单击复选框时才应调用Log.d。

3 个答案:

答案 0 :(得分:1)

  

我的列表现在只显示每行的复选框,而它应该是   显示文本视图以及复选框

您正在从框架中提升默认资源,但您没有为项目设置文本。您可以使用setText方法(继承自TextView),如下所示:

checkbox.setText(items.get(position));
  

只有在单击复选框时才应调用Log.d。

您没有检查是否单击了复选框(并在复选框上执行了不必要的强制转换)。你可以简单地做这样的事情:

checkbox.setOnClickListener(new OnClickListener() {
        public void onClick(View view){
            if (checkbox.isChecked()){
                Log.d("Test", "testing2");
            }
        }
});

答案 1 :(得分:0)

嗯,您需要在声明复选框后立即使用适当的参数字符串checkbox.setTextcheckbox.setText(items.get(position));调用。

答案 2 :(得分:0)

如提到的npace,您没有为视图设置文本。但是视图重用会有另一个问题。由于在列表视图中,视图被重复使用,您的复选框可能最终再次被使用,但它不会记住它所处的状态。您需要一个viewHolder类并在内部缓存复选框的状态并设置复选框状态。将再次画画。以下是需要完成的示例(我编写了一个可重复的多选择器小部件):

Multiple-Item-Selector