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