自定义列表适配器onClick方法返回空视图ID

时间:2016-04-17 23:25:24

标签: android onclick listadapter

在创建自定义列表适配器以便能够单击单个行条目中的不同元素并启动不同的活动时,我遇到了一个问题,即我的findViewById()方法返回null。此外,只有我的ListView中的第一项调用onClick方法;其他行不会记录点击次数。

public class CustomListAdapter extends SimpleAdapter implements View.OnClickListener {

Context context;
TextView habitId;
Intent intent;

public CustomListAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
    super(context, data, resource, from, to);
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    if (v == null) {
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.habit_entry, null);
    }

    TextView tv = (TextView) v.findViewById(R.id.habitTitle);
    tv.setOnClickListener(this);

    ImageView iv = (ImageView) v.findViewById(R.id.plus);
    iv.setOnClickListener(this);

    return super.getView(position, convertView, parent);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.habitTitle:
            Log.d("Test", "habitid = " + v.findViewById(R.id.habitId));
            break;
        case R.id.plus:
            Log.d("Test", "plus clicked");
        default:
            break;
    }
}

运行代码时,onClick的habitTitle案例打印

D/NULL: habitid = null

habit_entry          

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:src="@drawable/ic_plus"
    android:id="@+id/plus"
    android:scaleType="centerCrop"
    android:paddingRight="20dp"
    android:paddingLeft="20dp"
    android:background="#9bfcff" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/habitId"
    android:visibility="gone" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="difficulty"
    android:id="@+id/habitDifficulty"
    android:gravity="right"
    android:paddingLeft="15dp"
    android:layout_alignParentBottom="true"
    android:layout_alignRight="@+id/habitTitle"
    android:layout_alignEnd="@+id/habitTitle"
    android:layout_marginRight="30dp"
    android:layout_marginEnd="30dp" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@id/plus"
    android:layout_above="@id/habitDifficulty"
    android:layout_alignWithParentIfMissing="true"
    android:text="Your new habits go here!"
    android:id="@+id/habitTitle"
    android:padding="5dp"
    android:textColor="#444444"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_alignParentStart="false"
    android:gravity="right"
    android:allowUndo="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:text="frequency"
    android:id="@+id/habitFrequency"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" />


</RelativeLayout>

在MainActivity中调用

if(habitList.size() != 0) {
        ListView listView = (ListView) findViewById(android.R.id.list);

        ListAdapter adapter = new CustomListAdapter(
                this, habitList, R.layout.habit_entry, new String[]{"habitId", "title", "difficulty", "frequency"}, new int[]{
                R.id.habitId, R.id.habitTitle, R.id.habitDifficulty, R.id.habitFrequency});

        listView.setAdapter(adapter);
    }

列表完美填充,所以我不确定为什么我的适配器遇到这么多问题。

2 个答案:

答案 0 :(得分:1)

我在这看到几个问题。您自己正在膨胀View,然后通过调用View返回返回的super.getView(position, convertView, parent);。您应该依赖super.getView(position, convertView, parent);为您创建View,因为您使用的默认实现如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);

    v.findViewById(R.id.habitTitle)
            .setOnClickListener(this);

    v.findViewById(R.id.plus)
            .setOnClickListener(this);

    return v;
}

同样v.findViewById(R.id.habitId));onClick()内返回null,因为变量v本身就是TextView,其中id = R.id.habitId。

答案 1 :(得分:0)

您将habitId textview的可见性设置为已消失。 textview不会被夸大并且为null。 您可以在android documentation

中阅读有关可见性的更多信息