2012-03-07 48 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()中的視圖有什麼信息。