我使用的是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);
}
}
};
}