Проблема с onClickListener и ArrayAdapter в ListView (событие, затрагивающее несколько представлений) - PullRequest
0 голосов
/ 07 марта 2012

Я использую ArrayAdapter с моим ListView:

  • Что я пытаюсь достичь: Я отображаю (бесконечная прокрутка) просмотр списка смного изображений и подписей.Подписи могут иметь только одну строку.Обрезанный заголовок (который на самом деле длиннее одной строки) имеет 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 Ответ

1 голос
/ 07 марта 2012

Вероятно, это результат надувания представлений, поэтому самое простое решение - установить

setSingleLine( true ); setEllipsize( where );

в вашем методе getView ().

Однако это приведет к тому, что представление будет «нерасширенным» при прокрутке с экрана. Чтобы справиться с этим, я рекомендую отдельную структуру данных некоторого вида, которая будет содержать логическое значение, показывающее, было ли представление расширено. Может быть, hashMap или массив в зависимости от того, какая у вас информация о представлении в getView ().

...