如何正确调用列表项的子项的onClick方法?

时间:2017-04-13 20:25:20

标签: java android onclick

我无法使列表项的子项的onClick方法生效。目前,当我长按其中一个列表项时,会出现AppCompatImageView。现在我想为该元素实现onClick方法。目前,单击该按钮/图像会引发异常并导致我的应用崩溃:

java.lang.IllegalStateException: Could not find method deleteCurrentNote()(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageView with id 'listItemDeleteButton'

这是有道理的,因为onClick方法当前在显示列表的活动中实现。在哪里放置我的deleteCurrentNote()方法,这样可以正常工作?

我的一些代码(删节):

list_item_note.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout>

    <TextView
        android:id="@+id/listItemTitle" />

    <TextView
        android:id="@+id/listItemTags" />

    <android.support.v7.widget.AppCompatImageView
        android:id="@+id/listItemDeleteButton"
        app:srcCompat="@drawable/delete"
        android:onClick="deleteCurrentNote()"
        android:visibility="gone" />

</RelativeLayout>

NoteListActivity.java:

ListView listViewNotes = (ListView) findViewById(R.id.listViewNotes);

lazyAdapter = new LazyAdapter(this, notes);
listViewNotes.setAdapter(lazyAdapter);

listViewNotes.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        currentNote = allNotes.get(position);

        AppCompatImageView deleteButton = (AppCompatImageView) view.findViewById(R.id.listItemDeleteButton);
        deleteButton.setVisibility(View.VISIBLE);
        deleteButton.animate().alpha(1.0f).setDuration(5000);
        return true;
    }
});

...

public void deleteCurrentNote(View view) {
    ...
}

如果有帮助,我也可以从我的LazyAdapter上传代码。

另外,另一个问题,为什么我的deleteButton上的动画看起来很怪异? http://i.imgur.com/ECMEnvJ.gif

它迅速消失,然后瞬间消失,只是缓慢消失。我怎么能让它慢慢淡入呢?

感谢您的时间

2 个答案:

答案 0 :(得分:1)

如果你使用一些lib,那么

创建你自己的新LazyAdapter子类。或者,如果您使用自己的LazyAdapter

,请以这种方式更改代码
    class newClass extends LazyAdapter implements AdapterView.OnItemLongClickListener, AdapterView.OnClickListener {

 @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        currentNote = allNotes.get(position);
        AppCompatImageView deleteButton = (AppCompatImageView) view.findViewById(R.id.listItemDeleteButton);
        deleteButton.setOnClickListener(this);
        deleteButton.setVisibility(View.VISIBLE);
        deleteButton.animate().alpha(1.0f).setDuration(5000);
        return true;
    }
}

 @Override
            public void onClick(View view) {
                deleteCurrentNote();


  }
    }
您的基本代码中的

lazyAdapter = new newClass(this, notes); listViewNotes.setOnItemLongClickListener(lazyAdapter );

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout>

    <TextView
        android:id="@+id/listItemTitle" />

    <TextView
        android:id="@+id/listItemTags" />

    <android.support.v7.widget.AppCompatImageView
        android:id="@+id/listItemDeleteButton"
        app:srcCompat="@drawable/delete"
        android:visibility="gone" />

</RelativeLayout>

答案 1 :(得分:0)

知道了:

listViewNotes.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        currentNote = allNotes.get(position);

        AppCompatImageView deleteButton = (AppCompatImageView) view.findViewById(R.id.listItemDeleteButton);
        deleteButton.setOnClickListener(new AdapterView.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteCurrentNote();
            }
        });
        deleteButton.setVisibility(View.VISIBLE);
        deleteButton.animate().alpha(1.0f).setDuration(5000);
        return true;
    }
});

手动添加onClickListener就可以了。