自定义列表视图滚动隐藏进度流程和ImageView的 [英] Custom Listview scroll hiding progressbar process and ImageView

查看:102
本文介绍了自定义列表视图滚动隐藏进度流程和ImageView的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义列表视图,其中每个项目包含一个进度条。但是,当列表中包含很多项目,我用的是滚动条来浏览列表视图,一些ProgressBars消失,与ImageView的面临着同样的问题使用显示上传的图像(S)的状态,可能是什么原因,我怎么能解决呢?见下图

我的code

 静态类ViewHolder {
        公共ViewHolder(查看convertView){
            // TODO自动生成构造函数存根
        }
        TextView的imageNameTextView;
        ImageView的sdCardImageView,statusImageView;
        进度uploadProgressBar;
        的ImageButton uploadImageButton,dataImageButton,printImageButton,viewImageButton,deleteImageButton;
    }
     公共类ImageAdapter扩展了BaseAdapter
        {
            公共ImageAdapter(上下文C)
            {
            }

            公众诠释getCount将(){
                // TODO自动生成方法存根
                返回ImageList.size();
            }

            公共对象的getItem(INT位置){
                // TODO自动生成方法存根
                返回的位置;
            }

            众长getItemId(INT位置){
                // TODO自动生成方法存根
                返回的位置;
            }

    公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
        //避免不必要的电话,以每行,这是昂贵的findViewById()!
        支架=无效;

            //如果这个项目是要同步
            如果(flags.get(位置)){
                startUpload(位置);

            //标记为已同步
            flags.put(位置,假);
            }

            / *
             *如果convertView不为空,我们就可以重新使用它直接,无需通胀!
             *我们只吹一个新的视图时,convertView为空。
             * /
            如果(convertView == NULL){
            convertView = getLayoutInflater()膨胀(R.layout.list_upload,空)。
            持有人=新ViewHolder(convertView);

            //创建一个ViewHolder和存储引用给孩子的意见
            holder.imageNameTextView =(TextView中)convertView.findViewById(R.id.C​​olImgName);
            holder.sdCardImageView =(ImageView的)convertView.findViewById(R.id.C​​olImgPath);
            holder.statusImageView =(ImageView的)convertView.findViewById(R.id.C​​olStatus);
            holder.uploadProgressBar =(进度)convertView.findViewById(R.id.progressBar);
            holder.uploadImageButton =(的ImageButton)convertView.findViewById(R.id.btnUpload);
            holder.dataImageButton =(的ImageButton)convertView.findViewById(R.id.btnData);
            holder.printImageButton =(的ImageButton)convertView.findViewById(R.id.btnPrint);
            holder.viewImageButton =(的ImageButton)convertView.findViewById(R.id.btnView);
            holder.deleteImageButton =(的ImageButton)convertView.findViewById(R.id.btnDelete);

                //标签可以是任何对象,这恰好是ViewHolder
                convertView.setTag(保持器);
            } 其他 {

                支架=(ViewHolder)convertView.getTag();
            }

            strPath的= ImageList.get(位置)的ToString();

            //获取文件名
            文件名= strPath.substring(strPath.lastIndexOf('_')+ 1,strPath.length());
            文件=新的文件(strPath的);
            @燮pressWarnings(未使用)
            长长度= file.length();
            holder.imageNameTextView.setText(文件名);

            最后BitmapFactory.Options选项=新BitmapFactory.Options();

            options.inSampleSize = 8;

            位图BM = BitmapFactory.de codeFILE(strPath中,选项);
            holder.sdCardImageView.setImageBitmap(BM);

            holder.statusImageView.setImageResource(R.drawable.bullet_button);

            holder.uploadProgressBar.setVisibility(View.GONE);

            // btnUpload
            holder.uploadImageButton.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图v){
            //上传
                 CD =新ConnectionDetector(getApplicationContext());

                    //检查网络连接
                    如果(!cd.isConnectingToInternet()){
                        // Internet连接没有present
                        alert.showAlertDialog(UploadActivity.this,不可用互联网,
                                请连接到Internet连接,假);
                        //停止执行返回code
                        返回;
                    }

                    startUpload(位置);
                }
            });

         //上传
    公共无效startUpload(最终诠释位置){

        可运行可运行=新的Runnable(){

        公共无效的run(){

            handler.post(新的Runnable(){

        公共无效的run(){

            V = lstView.getChildAt(位置 -  lstView.getFirstVisiblePosition());

            holder.uploadProgressBar.setVisibility(View.VISIBLE);

            holder.statusImageView.setImageResource(R.drawable.bullet_button);

                新UploadFileAsync()执行(将String.valueOf(位置));
                        }
                    });
                }
            };
            新的线程(可运行)。开始();
            }

            //异步上传
            公共类UploadFileAsync扩展的AsyncTask<字符串,太虚,太虚> {

                字符串resServer;

            在preExecute保护无效(){
                super.on preExecute();
            }

            @覆盖
            保护无效doInBackground(字符串... PARAMS){
            // TODO自动生成方法存根
                位置=的Integer.parseInt(PARAMS [0]);

                INT读取动作,方bytesAvailable,缓冲区大小;
                byte []的缓冲区;
                INT maxBufferSize = 1 * 1024 * 1024;
                INT水库code = 0;
                字符串resMessage =;

                字符串lineEnd =\ r \ N的;
                串twoHyphens = - ;
                字符串边界=*****;

                // 文件路径
                字符串strSDPath = ImageList.get(位置)的ToString();

                //上传到PHP脚本
                字符串strUrlServer =HTTP://domein/fiile.php;

                尝试 {
                    / **检查SD卡文件*** /
                    档案文件=新的文件(strSDPath);
                    如果(!file.exists())
                    {
                        resServer ={\StatusID \:\0 \,\错误\:\请检查SD卡\路径};
                        返回null;
                    }

                的FileInputStream的FileInputStream =新的FileInputStream(新文件(strSDPath));

                网址URL =新的URL(strUrlServer);
                HttpURLConnection的康恩=(HttpURLConnection类)url.openConnection();
                    conn.setDoInput(真正的);
                    conn.setDoOutput(真正的);
                    conn.setUseCaches(假);
                    conn.setRequestMethod(POST);

                    conn.setRequestProperty(连接,保持活动);
                    conn.setRequestProperty(内容类型,
                            的multipart / form-data的;边界=+界);

                DataOutputStream类的OutputStream =新DataOutputStream类(康涅狄格州
                        .getOutputStream());
                    outputStream.writeBytes(twoHyphens +边界+ lineEnd);
                    的OutputStream
                    .writeBytes(内容处置:表格数据;名称= \filUpload \;文件名= \
                            + strSDPath +\+ lineEnd);
                    outputStream.writeBytes(lineEnd);

                方bytesAvailable = fileInputStream.available();
                BUFFERSIZE = Math.min(方bytesAvailable,maxBufferSize);
                缓冲区=新的字节[BUFFERSIZE]

                //读取文件
                读取动作= fileInputStream.read(缓冲液,0,BUFFERSIZE);

                而(读取动作大于0){
                    outputStream.write(缓冲液,0,BUFFERSIZE);
                    方bytesAvailable = fileInputStream.available();
                    BUFFERSIZE = Math.min(方bytesAvailable,maxBufferSize);
                    读取动作= fileInputStream.read(缓冲液,0,BUFFERSIZE);
                }

                outputStream.writeBytes(lineEnd);
                outputStream.writeBytes(twoHyphens +边界+ twoHyphens + lineEnd);

                //响应code和留言
                水库code = conn.getResponse code();
                    如果(RES code == HttpURLConnection.HTTP_OK)
                    {
                        InputStream的是= conn.getInputStream();
                        ByteArrayOutputStream BOS =新ByteArrayOutputStream();

                INT读= 0;
                而((读= is.​​read())!= -1){
                    bos.write(读);
                }

                byte []的结果= bos.toByteArray();
                    bos.close();

                resMessage =新的字符串(结果);

                }

                Log.d(RES code =,Integer.toString(RES code));
                Log.d(resMessage =,resMessage.toString());

                fileInputStream.close();
                outputStream.flush();
                outputStream.close();

                resServer = resMessage.toString();


                }赶上(例外前){
                    ex.printStackTrace();
                }

                返回null;
                }

                保护无效onPostExecute(作废不用){
                    statusWhenFinish(位置,resServer);
                    }

                }


            //当上传完成
            @燮pressWarnings(未使用)
            保护无效statusWhenFinish(INT位置,串resServer){

            视图V = lstView.getChildAt(位置 -  lstView.getFirstVisiblePosition());

            //隐藏进度
            holder.uploadProgressBar.setVisibility(View.GONE);


            /*** 默认值 ***/
            串strStatusID =0;
            字符串STRERROR =;

            尝试 {

            JSONObject的C =新的JSONObject(resServer);
            strStatusID = c.getString(StatusID);
            STRERROR = c.getString(信息);
            }赶上(JSONException E){
            // TODO自动生成的catch块
            e.printStackTrace();
            }

            //使用if  - 否则,如果
            如果(strStatusID.equals(0))
            {
                // 已经存在
              holder.statusImageView.setImageResource(R.drawable.already_exist);
            }
            否则如果(strStatusID.equals(1)){
                //上传做过
                holder.statusImageView.setImageResource(R.drawable.upload_done);
            }
            否则//如果上传失败
            {
                 // 上传失败
                holder.statusImageView.setImageResource(R.drawable.upload_failed);
            }

            }

         }
 

解决方案

在你的 ViewHolder 类:

 静态类ViewHolder {
     // ...
     布尔isUploading = FALSE;
     // ...
}
 

在你的 getView()

 公开查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
     // ...
     如果(holder.isUploading){
           holder.uploadProgressBar.setVisibility(View.VISIBLE);
     } 其他 {
           holder.uploadProgressBar.setVisibility(View.GONE);
     }
     // ...
}
 

在你的 startUpload()

 公共无效startUpload(最终诠释位置){
     // ...
     holder.uploadProgressBar.setVisibility(View.VISIBLE);
     holder.isUploading = TRUE;
     // ...
}
 

希望它会工作。

I have a custom Listview, where each item contains a progressbar. But when the list contains many items, and I use the scrollbar to navigate through listview, some ProgressBars disappear and facing same issue with imageview using to show status of uploaded image(s), what could be the reason and how can i resolve this ? see my code below

    static class ViewHolder {
        public ViewHolder(View convertView) {
            // TODO Auto-generated constructor stub
        }
        TextView imageNameTextView;
        ImageView sdCardImageView, statusImageView;
        ProgressBar uploadProgressBar;
        ImageButton uploadImageButton, dataImageButton, printImageButton, viewImageButton, deleteImageButton ;
    }  
     public class ImageAdapter extends BaseAdapter
        {
            public ImageAdapter(Context c)
            {
            }

            public int getCount() {
                // TODO Auto-generated method stub
                return ImageList.size();
            }

            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

    public View getView(final int position, View convertView, ViewGroup parent) {
        // Avoid unneccessary calls to findViewById() on each row, which is expensive!
        holder = null;

            // If this item is to be synced
            if(flags.get(position)) {
                startUpload(position);

            // Mark as synced
            flags.put(position, false);
            }

            /*
             * If convertView is not null, we can reuse it directly, no inflation required!
             * We only inflate a new View when the convertView is null.
             */
            if (convertView == null) {
            convertView = getLayoutInflater().inflate(R.layout.list_upload, null);
            holder = new ViewHolder(convertView);

            // Create a ViewHolder and store references to the children views
            holder.imageNameTextView = (TextView) convertView.findViewById(R.id.ColImgName);
            holder.sdCardImageView = (ImageView) convertView.findViewById(R.id.ColImgPath);
            holder.statusImageView = (ImageView) convertView.findViewById(R.id.ColStatus);
            holder.uploadProgressBar = (ProgressBar) convertView.findViewById(R.id.progressBar);
            holder.uploadImageButton = (ImageButton) convertView.findViewById(R.id.btnUpload);
            holder.dataImageButton = (ImageButton) convertView.findViewById(R.id.btnData);
            holder.printImageButton = (ImageButton) convertView.findViewById(R.id.btnPrint);
            holder.viewImageButton = (ImageButton) convertView.findViewById(R.id.btnView);
            holder.deleteImageButton = (ImageButton) convertView.findViewById(R.id.btnDelete);

                // The tag can be any Object, this just happens to be the ViewHolder
                convertView.setTag(holder);
            } else {

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

            strPath = ImageList.get(position).toString();

            // Get File Name
            fileName = strPath.substring( strPath.lastIndexOf('_')+1, strPath.length() );
            file = new File(strPath);
            @SuppressWarnings("unused")
            long length = file.length();
            holder.imageNameTextView.setText(fileName);

            final BitmapFactory.Options options = new BitmapFactory.Options();

            options.inSampleSize = 8;

            Bitmap bm = BitmapFactory.decodeFile(strPath,options);
            holder.sdCardImageView.setImageBitmap(bm);       

            holder.statusImageView.setImageResource(R.drawable.bullet_button);

            holder.uploadProgressBar.setVisibility(View.GONE);

            //btnUpload
            holder.uploadImageButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            // Upload
                 cd = new ConnectionDetector(getApplicationContext());

                    // Check for internet connection
                    if (!cd.isConnectingToInternet()) {
                        // Internet Connection is not present
                        alert.showAlertDialog(UploadActivity.this, "Internet not available",
                                "Please connect to working Internet connection", false);
                        // stop executing code by return
                        return;
                    }

                    startUpload(position);
                }
            });

         //Upload
    public void startUpload(final int position) {      

        Runnable runnable = new Runnable() {

        public void run() {

            handler.post(new Runnable() {

        public void run() {

            v = lstView.getChildAt(position - lstView.getFirstVisiblePosition());

            holder.uploadProgressBar.setVisibility(View.VISIBLE);

            holder.statusImageView.setImageResource(R.drawable.bullet_button);

                new UploadFileAsync().execute(String.valueOf(position));   
                        }
                    });
                }
            };
            new Thread(runnable).start();
            }

            // Async Upload
            public class UploadFileAsync extends AsyncTask<String, Void, Void> {

                String resServer;

            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected Void doInBackground(String... params) {
            // TODO Auto-generated method stub
                position = Integer.parseInt(params[0]);

                int bytesRead, bytesAvailable, bufferSize;
                byte[] buffer;
                int maxBufferSize = 1 * 1024 * 1024;
                int resCode = 0;
                String resMessage = "";

                String lineEnd = "\r\n";
                String twoHyphens = "--";
                String boundary =  "*****";

                // File Path
                String strSDPath = ImageList.get(position).toString();

                // Upload to PHP Script
                String strUrlServer = "http://domein/fiile.php";

                try {
                    /** Check file on SD Card ***/
                    File file = new File(strSDPath);
                    if(!file.exists())
                    {   
                        resServer = "{\"StatusID\":\"0\",\"Error\":\"Please check path on SD Card\"}";
                        return null;
                    }

                FileInputStream fileInputStream = new FileInputStream(new File(strSDPath));

                URL url = new URL(strUrlServer);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setDoInput(true);
                    conn.setDoOutput(true);
                    conn.setUseCaches(false);
                    conn.setRequestMethod("POST");

                    conn.setRequestProperty("Connection", "Keep-Alive");
                    conn.setRequestProperty("Content-Type",
                            "multipart/form-data;boundary=" + boundary);

                DataOutputStream outputStream = new DataOutputStream(conn
                        .getOutputStream());
                    outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                    outputStream
                    .writeBytes("Content-Disposition: form-data; name=\"filUpload\";filename=\""
                            + strSDPath + "\"" + lineEnd);
                    outputStream.writeBytes(lineEnd);

                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                // Read file
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                while (bytesRead > 0) {
                    outputStream.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                }

                outputStream.writeBytes(lineEnd);
                outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                // Response Code and  Message
                resCode = conn.getResponseCode();
                    if(resCode == HttpURLConnection.HTTP_OK)
                    {
                        InputStream is = conn.getInputStream();
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();

                int read = 0;
                while ((read = is.read()) != -1) {
                    bos.write(read);
                }

                byte[] result = bos.toByteArray();
                    bos.close();

                resMessage = new String(result);

                }

                Log.d("resCode=",Integer.toString(resCode));
                Log.d("resMessage=",resMessage.toString());

                fileInputStream.close();
                outputStream.flush();
                outputStream.close();

                resServer = resMessage.toString();


                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                return null;
                }

                protected void onPostExecute(Void unused) {
                    statusWhenFinish(position,resServer);
                    }

                }


            // When UPload Finish
            @SuppressWarnings("unused")
            protected void statusWhenFinish(int position, String resServer) {

            View v = lstView.getChildAt(position - lstView.getFirstVisiblePosition());

            // hide ProgressBar
            holder.uploadProgressBar.setVisibility(View.GONE);


            /*** Default Value ***/
            String strStatusID = "0" ;
            String strError = "" ;

            try {      

            JSONObject c = new JSONObject(resServer);
            strStatusID = c.getString("StatusID");
            strError = c.getString("Message");
            } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }

            // using if - else if
            if(strStatusID.equals("0"))
            {   
                // already exist
              holder.statusImageView.setImageResource(R.drawable.already_exist);
            }
            else if(strStatusID.equals("1"))                {
                // upload done
                holder.statusImageView.setImageResource(R.drawable.upload_done);
            }
            else // if upload failed
            {
                 // upload failed
                holder.statusImageView.setImageResource(R.drawable.upload_failed);
            }

            }

         }

解决方案

In your ViewHolder class :

static class ViewHolder {
     //...
     boolean isUploading = false;
     //...
}

In your getView():

public View getView(final int position, View convertView, ViewGroup parent) {
     //...
     if(holder.isUploading) {
           holder.uploadProgressBar.setVisibility(View.VISIBLE);
     } else {
           holder.uploadProgressBar.setVisibility(View.GONE);
     }
     //...
}

In your startUpload():

public void startUpload(final int position) { 
     //...
     holder.uploadProgressBar.setVisibility(View.VISIBLE);
     holder.isUploading = true;
     //...
}

Hope it will work.

这篇关于自定义列表视图滚动隐藏进度流程和ImageView的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆