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

时间:2012-03-07 00:22:04

标签: android listview textview adapter onclicklistener

我正在使用带有ListView的ArrayAdapter:

  • 我想要实现的目标: 我正在显示一个(无尽的滚动)列表视图,其中包含许多图像和标题。字幕只允许有一行。修剪后的标题(实际上长于一行)有一个onClickListener,它删除了一行限制以显示整个标题(setSingleLine( false ), setEllipsize( null ))。

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

  • 守则:

XML-布局

<LinearLayout ... >

    ...

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

    ...

</LinearLayout>

ArrayAdapter

public class ImageArrayAdapter extends ArrayAdapter<Image>
{
    private static class ViewHolder
    {
        public TextView     caption;    
        ...
    }

    private final List<Image>   images;

    private LayoutInflater      inflater;

    ...

    @Override
    public View getView( int position, View contentView, ViewGroup parent )
    {
        ViewHolder holder;

        if( contentView == null )
        {
            holder = new ViewHolder();
            contentView = inflater.inflate( R.layout.image, null );

            holder.caption = (TextView) contentView.findViewById( R.id.caption );
            ...

            Typeface font = Typeface.createFromAsset( getContext().getAssets(), "fonts/EXO-ITALIC.TTF" );
            holder.caption.setTypeface( font );

            contentView.setTag( holder );
        }
        else
        {
            holder = (ViewHolder) contentView.getTag();
        }

        Image image = images.get( position );

        holder.caption.setText( image.getTitle() );
        ...

        return contentView;
    }
}

CaptionView

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 );
            }
        }
    };
}

1 个答案:

答案 0 :(得分:1)

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

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

然而,当它滚出屏幕时,这将导致视图变为“未展开”。为了解决这个问题,我建议使用某种单独的数据结构来保持一个布尔值来判断视图是否已经扩展。可能是hashMap或数组,具体取决于您在getView()中有关视图的信息。