【问题标题】:Making ListView Scrolling Smooth position?使 ListView 滚动平滑位置?
【发布时间】:2013-12-30 17:33:15
【问题描述】:

我在 android.developer.com 上阅读了有关“使 ListView 滚动平滑”的文章,但有一件事我不明白:在哪里放置或获取“位置”的值,因为我的 eclipse 说:“无法引用到以不同方法定义的内部类中的非最终变量位置”。 我将此代码放在我的适配器类中的 getView 方法中。

package com.example.filemanager;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Formatter.BigDecimalLayoutForm;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.DateSorter;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

public class ItemAdapter extends ArrayAdapter<Item> {
private final Context context;
private final ArrayList<Item> values;
public int position;

public ItemAdapter(Context context, ArrayList<Item> values) {
    super(context, R.layout.item, values);
    this.context = context;
    this.values = values;
}

@Override
public Item getItem(int position) {
    // TODO Auto-generated method stub
    return super.getItem(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub



    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.item, parent, false);
    TextView title = (TextView) rowView.findViewById(R.id.title);
    TextView info = (TextView) rowView.findViewById(R.id.info);
    ImageView icon = (ImageView) rowView.findViewById(R.id.icon);
    ImageView menu = (ImageView) rowView.findViewById(R.id.menu);

    title.setText(values.get(position).getName());
    info.setText(sizeString(position) + " " + dateString(position) + " "
            + rightsString(position));

    if (values.get(position).isisDir()) {
        icon.setImageResource(R.drawable.dir);
    } else if (!values.get(position).isisDir()) {

        if (values.get(position).getPath().endsWith(".jpg")
                || values.get(position).getPath().endsWith(".png")) {

            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 50;
            options.inDensity = 100;
            options.inScreenDensity = 1;

            Bitmap myBitmap = BitmapFactory.decodeFile(values.get(position).getPath(), options);                
            icon.setImageBitmap(myBitmap);
        }else{

            icon.setImageResource(R.drawable.file);
        }

    }

    menu.setImageResource(R.drawable.menu);



    ViewHolder holder = new ViewHolder();
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);
    holder.menu = (ImageView) convertView.findViewById(R.id.menu);
    holder.title = (TextView) convertView.findViewById(R.id.title);
    holder.info = (TextView) convertView.findViewById(R.id.info);
    holder.progress = (ProgressBar) convertView.findViewById(R.id.progressSpinner);
    convertView.setTag(holder);



    // Using an AsyncTask to load the slow images in a background thread
            new AsyncTask<ViewHolder, Void, Bitmap>() {
                private ViewHolder v;

                @Override
                protected Bitmap doInBackground(ViewHolder... params) {
                    v = params[0];
                    //return mFakeImageLoader.getImage();



                    return null;
                }

                @Override
                protected void onPostExecute(Bitmap result) {
                    super.onPostExecute(result);
                    if (v.position == position) {
                        // If this item hasn't been recycled already, hide the
                        // progress and set and show the image
                        v.progress.setVisibility(View.GONE);
                        v.icon.setVisibility(View.VISIBLE);
                        v.icon.setImageBitmap(result);
                    }
                }
            }.execute(holder);






    return rowView;
}

private String rightsString(int position) {
    String temp = "";
    if (values.get(position).isReadable()) {
        temp += "r";
    } else {
        temp += "-";
    }
    if (values.get(position).isWritable()) {
        temp += "w";
    } else {
        temp += "-";
    }
    if (values.get(position).isExecutable()) {
        temp += "x";
    } else {
        temp += "-";
    }
    return temp;
}

private String dateString(int position) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    return df.format(values.get(position).getDate());
}

private String sizeString(int position) {

    long bytes = values.get(position).getSize();

    double kb = bytes / 1024.0;
    double mb = kb / 1024.0;
    double gb = mb / 1024.0;

    if (gb >= 1) {
        return gb + " GB";
    }
    if (mb >= 1) {
        return mb + " MB";
    }
    if (kb >= 1) {
        return kb + " KB";
    } else {
        return bytes + " bytes";
    }

}


static class ViewHolder {

    ImageView icon, menu;
    TextView title, info;
    ProgressBar progress;
    int position;

}

}

【问题讨论】:

  • 请给我们整个课程代码

标签: android listview scroll smooth custom-lists


【解决方案1】:

好的,所以你需要了解一点关于外部、内部和匿名类等的知识。发生的事情是你正在创建一个匿名类,声明为

新的 AsyncTask()....

并且该类中的任何变量都必须是最终的或不引用父类。

那么,你需要做的是:

final int finalPosition = 位置; // 使用 AsyncTask 在后台线程中加载慢速图像 新的异步任务(){ 私人 ViewHolder v; @Override 受保护的位图 doInBackground(ViewHolder... 参数) { v = 参数[0]; 返回空值; } @Override protected void onPostExecute(位图结果){ super.onPostExecute(结果); 如果(v.position == finalPosition){ // 如果这个项目还没有被回收,隐藏 //进度并设置和显示图像 v.progress.setVisibility(View.GONE); v.icon.setVisibility(View.VISIBLE); v.icon.setImageBitmap(结果); } } }.execute(持有人);

Reference

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2017-03-12
    • 2014-01-12
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多