2012-03-07 53 views
0

我使用的是ArrayAdapter与我的ListView:问题与onClickListener和ArrayAdapter在ListView控件(事件影响多个视图)

  • 我试图才达到: 我显示(无尽的滚动)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

这可能是充气意见的结果,因此最简单的解决办法是设置

setSingleLine(true); setEllipsize(where); 

在getView()方法。

但是,这会导致视图在滚动屏幕时变为“未展开”。为了解决这个问题,我推荐了一种独立的数据结构,它保留一个布尔值来告诉视图是否被扩展。也许是一个hashMap或一个数组,取决于你对getView()中的视图有什么信息。