Android ListView中onClickListener和ArrayAdapter出现问题(影响多个视图的事件)

Android ListView中onClickListener和ArrayAdapter出现问题(影响多个视图的事件),android,listview,textview,adapter,onclicklistener,Android,Listview,Textview,Adapter,Onclicklistener,我正在将ArrayAdapter用于我的ListView: 我想要达到的目标: 我正在显示一个(无休止的滚动)列表视图,其中有很多图像和标题。标题只能有一行。经过修剪的标题(实际上比一行长)有一个onClickListener,它删除了显示整个标题的一行限制(setSingleLine(false),setEllipsize(null)) 我面临的问题:当我点击其中一个标题时,其他一些标题也可能受到影响。因此,当我单击标题并不断向下滚动时,我很可能会发现已经展开但尚未单击的标题。我假设这是由适

我正在将ArrayAdapter用于我的ListView:

  • 我想要达到的目标: 我正在显示一个(无休止的滚动)列表视图,其中有很多图像和标题。标题只能有一行。经过修剪的标题(实际上比一行长)有一个onClickListener,它删除了显示整个标题的一行限制(
    setSingleLine(false),setEllipsize(null)

  • 我面临的问题:当我点击其中一个标题时,其他一些标题也可能受到影响。因此,当我单击标题并不断向下滚动时,我很可能会发现已经展开但尚未单击的标题。我假设这是由适配器的视图重用引起的,但我还没有研究整个概念,因为我刚刚开始在android环境中编程

  • 守则:

XML布局

<LinearLayout ... >

    ...

    <com.app.views.CaptionView
        android:id="@+id/caption" ... />

    ...

</LinearLayout>

这可能是视图膨胀的结果,所以最简单的解决方案是设置

setSingleLine( true ); setEllipsize( where );
在getView()方法中

但是,当视图从屏幕上滚动时,这将导致视图变为“未展开”。为了解决这个问题,我建议使用一种单独的数据结构,它可以保存一个布尔值,告诉您视图是否已展开。可能是hashMap或数组,具体取决于您在getView()中获得的有关视图的信息

public class CaptionView extends TextView
{
    private boolean modified    = false;

    ...

    @Override
    protected void onDraw( Canvas canvas )
    {
        super.onDraw( canvas );

        if( !modified && getLineCount() > 1 )
        {
            modified = true;
            setClickable( true );
            setEllipsize( TruncateAt.END );
            setSingleLine( true );
            setOnClickListener( onClickListener );
        }
    }

    private OnClickListener onClickListener = new OnClickListener()
    {
        public void onClick( View view )
        {
            TextView caption = (TextView) view;

            if( caption.getLineCount() == 1 )
            {
                caption.setSingleLine( false );
                caption.setEllipsize( null );
            }
            else
            {
                caption.setSingleLine( true );
                caption.setEllipsize( TruncateAt.END );
            }
        }
    };
}
setSingleLine( true ); setEllipsize( where );