Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 向上滚动具有不同项目高度的ListView_Android_Listview - Fatal编程技术网

Android 向上滚动具有不同项目高度的ListView

Android 向上滚动具有不同项目高度的ListView,android,listview,Android,Listview,我有一个包含不同高度的项目的ListView。当我向上滚动时,它不是平滑的,会出现跳跃效果。所有项目都具有包裹内容高度。我怎样才能平滑地向上滚动 以下是适配器代码: public class EventFeedAdapter extends ArrayAdapter<Post> { public EventFeedAdapter(Context context, List<Post> items) { super(context, R.layout.item_e

我有一个包含不同高度的项目的ListView。当我向上滚动时,它不是平滑的,会出现跳跃效果。所有项目都具有包裹内容高度。我怎样才能平滑地向上滚动

以下是适配器代码:

public class EventFeedAdapter extends ArrayAdapter<Post> {

public EventFeedAdapter(Context context, List<Post> items) {
    super(context, R.layout.item_event_feed, items);
}

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
    if (convertView == null) {
        convertView = View.inflate(getContext(), R.layout.item_event_feed,
                null);
        ViewHolder vh = new ViewHolder();
        vh.avatar = (ImageView) convertView.findViewById(R.id.avatar);
        vh.photo = (ImageView) convertView.findViewById(R.id.photo);
        vh.textName = (TextView) convertView.findViewById(R.id.textName);
        vh.textTime = (TextView) convertView.findViewById(R.id.textTime);
        vh.progress = (ProgressBar) convertView.findViewById(R.id.progress);
        vh.buttonLike = (ImageView) convertView
                .findViewById(R.id.buttonLike);
        vh.buttonMore = (ImageView) convertView
                .findViewById(R.id.buttonMore);
        vh.textLikes = (TextView) convertView.findViewById(R.id.textLikes);
        convertView.setTag(vh);
    }

    final ViewHolder holder = (ViewHolder) convertView.getTag();

    Post post = getItem(position);
    String name = post.isFake() ? UserModel.get().getUser().getName()
            : post.getDisplayName();
    String avatar = post.isFake() ? UserModel.get().getUser()
            .getPictureUrl() : post.getProfileThumb();
    String mediaUrl = post.isFake() ? String.format("file://%s",
            post.getLocalMediaUri()) : post.getMediaFeed().getUrl();

    ImageLoader.getInstance().displayImage(mediaUrl, holder.photo,
            new ImageLoadingListener() {

                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    holder.progress.setVisibility(View.VISIBLE);
                }

                @Override
                public void onLoadingFailed(String imageUri, View view,
                        FailReason failReason) {
                    holder.progress.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage) {
                    holder.progress.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingCancelled(String imageUri, View view) {
                    holder.progress.setVisibility(View.GONE);
                }
            });

    ImageLoader.getInstance().displayImage(avatar, holder.avatar);
    holder.textName.setText(name);
    Date date = post.isFake() ? post.getLocalDate() : post.getCreatedAt();
    holder.textTime.setText(DateUtils.getFormattedDate(getContext(), date));
    holder.buttonLike
            .setImageResource(post.isLocalLiked() ? R.drawable.icon_heart_filled
                    : R.drawable.icon_heart);
    if (post.isLocalLiked() && post.getLocalLikesCount() == 1)
        holder.textLikes.setText(R.string.you_like_this);
    else if (post.getLocalLikesCount() > 0)
        holder.textLikes.setText(String.format(
                getContext().getString(R.string.likes),
                post.getLocalLikesCount()));
    else
        holder.textLikes.setText("");

    holder.buttonLike.setTag(post);
    holder.buttonMore.setTag(post);

    return convertView;
}

class ViewHolder {
    ImageView photo;
    ImageView avatar;
    ImageView buttonLike;
    ImageView buttonMore;
    TextView textName;
    TextView textTime;
    ProgressBar progress;
    TextView textLikes;
}
}
公共类EventFeedAdapter扩展了ArrayAdapter{
公共EventFeedAdapter(上下文、列表项){
super(上下文、R.layout.item\u事件\u提要、items);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组arg2){
if(convertView==null){
convertView=View.inflate(getContext(),R.layout.item\u事件\u提要,
无效);
ViewHolder vh=新的ViewHolder();
vh.avatar=(ImageView)convertView.findViewById(R.id.avatar);
vh.photo=(ImageView)convertView.findViewById(R.id.photo);
vh.textName=(TextView)convertView.findViewById(R.id.textName);
vh.textTime=(TextView)convertView.findViewById(R.id.textTime);
vh.progress=(ProgressBar)convertView.findViewById(R.id.progress);
vh.buttonLike=(图像视图)转换视图
.findViewById(R.id.按钮状);
vh.buttonMore=(图像视图)转换视图
.findviewbyd(R.id.buttonMore);
vh.textLikes=(TextView)convertView.findViewById(R.id.textLikes);
convertView.setTag(vh);
}
final ViewHolder=(ViewHolder)convertView.getTag();
Post Post=获取项目(位置);
String name=post.isFake()?UserModel.get().getUser().getName()
:post.getDisplayName();
字符串avatar=post.isFake()?UserModel.get().getUser()
.getPictureUrl():post.getProfileThumb();
String mediaUrl=post.isFake()?String.format(“文件://%s”,
post.getLocalMediaUri()):post.getMediaFeed().getUrl();
ImageLoader.getInstance().displayImage(mediaUrl、holder.photo、,
新建ImageLoadingListener(){
@凌驾
public void onLoadingStarted(字符串imageUri,视图){
holder.progress.setVisibility(View.VISIBLE);
}
@凌驾
public void onload失败(字符串imageUri、视图、,
失效原因(失效原因){
holder.progress.setVisibility(View.GONE);
}
@凌驾
public void onLoadingComplete(字符串imageUri、视图、,
位图加载(图像){
holder.progress.setVisibility(View.GONE);
}
@凌驾
public void onLoadingCancelled(字符串imageUri,视图){
holder.progress.setVisibility(View.GONE);
}
});
ImageLoader.getInstance().displayImage(avatar,holder.avatar);
holder.textName.setText(名称);
日期日期=post.isFake()?post.getLocalDate():post.getCreatedAt();
holder.textTime.setText(DateUtils.getFormattedDate(getContext(),date));
钮扣状
.setImageResource(post.isLocallied()?R.drawable.icon\u heart\u filled
:R.可绘制。图标(心);
if(post.isLocalLiked()&&post.getLocalLikeCount()==1)
holder.textLikes.setText(R.string.you\u this);
else if(post.getLocalLikeCount()>0)
holder.textLikes.setText(String.format(
getContext().getString(R.string.likes),
post.getLocalLikeCount());
其他的
holder.textLikes.setText(“”);
支架.按钮状.设置标签(post);
固定器。按钮更多。设置标签(post);
返回视图;
}
类视图持有者{
ImageView照片;
图像视图化身;
图像视图按钮状;
图像视图按钮更多;
文本视图文本名称;
文本视图文本时间;
进度条进度;
TextView textLikes;
}
}
如果我对项目使用固定高度,滚动效果很好。

那么,在哪里使用“vh”?据我所知,您必须包含一个“else”语句,并使用您定义的“holder”变量。否则,我怀疑holder可能为null,并且无论convertView是否为null,每次都调用getView。我想。。。这有用吗

编辑:噢,天哪,我的推理是错误的。。当然,您要确保convert视图不为null。不过还是试试这个吧

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
final ViewHolder holder;
if (convertView == null) {
    convertView = View.inflate(getContext(), R.layout.item_event_feed,
            null);


    holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
    holder.photo = (ImageView) convertView.findViewById(R.id.photo);
    holder.textName = (TextView) convertView.findViewById(R.id.textName);
    holder.textTime = (TextView) convertView.findViewById(R.id.textTime);
    holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
    holder.buttonLike = (ImageView) convertView
            .findViewById(R.id.buttonLike);
    holder.buttonMore = (ImageView) convertView
            .findViewById(R.id.buttonMore);
    holder.textLikes = (TextView) convertView.findViewById(R.id.textLikes);
    convertView.setTag(holder);
}
else
{

   holder=(ViewHolder) convertView.getTag();  
}


Post post = getItem(position);
String name = post.isFake() ? UserModel.get().getUser().getName()
        : post.getDisplayName();
String avatar = post.isFake() ? UserModel.get().getUser()
        .getPictureUrl() : post.getProfileThumb();
String mediaUrl = post.isFake() ? String.format("file://%s",
        post.getLocalMediaUri()) : post.getMediaFeed().getUrl();

ImageLoader.getInstance().displayImage(mediaUrl, holder.photo,
        new ImageLoadingListener() {

            @Override
            public void onLoadingStarted(String imageUri, View view) {
                holder.progress.setVisibility(View.VISIBLE);
            }

            @Override
            public void onLoadingFailed(String imageUri, View view,
                    FailReason failReason) {
                holder.progress.setVisibility(View.GONE);
            }

            @Override
            public void onLoadingComplete(String imageUri, View view,
                    Bitmap loadedImage) {
                holder.progress.setVisibility(View.GONE);
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {
                holder.progress.setVisibility(View.GONE);
            }
        });

ImageLoader.getInstance().displayImage(avatar, holder.avatar);
holder.textName.setText(name);
Date date = post.isFake() ? post.getLocalDate() : post.getCreatedAt();
holder.textTime.setText(DateUtils.getFormattedDate(getContext(), date));
holder.buttonLike
        .setImageResource(post.isLocalLiked() ? R.drawable.icon_heart_filled
                : R.drawable.icon_heart);
if (post.isLocalLiked() && post.getLocalLikesCount() == 1)
    holder.textLikes.setText(R.string.you_like_this);
else if (post.getLocalLikesCount() > 0)
    holder.textLikes.setText(String.format(
            getContext().getString(R.string.likes),
            post.getLocalLikesCount()));
else
    holder.textLikes.setText("");

holder.buttonLike.setTag(post);
holder.buttonMore.setTag(post);

return convertView;

}

在此处发布ListView BaseAdapter代码。。不,在我的解决方案中,holder不能为null,因为它总是写入标记,然后从中加载。我发现了问题。它在UniversalImageLoader中-它在图像显示之前重置图像视图。现在我用AQuery来代替。是的,我编辑了答案,我太傻了。很高兴你找到了答案。快乐编码。