使用 ViewHolder 显示 ListView 中最后一个列表项的状态

问题描述 投票:0回答:4
    int globalPosition ;

    ..............

    buttonAllData.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
        new UploadBulkData(globalPosition).execute();

        } 
    });

   ........

   class UploadBulkData extends AsyncTask<String, String, String> {
    private ProgressDialog pDialog;
    int dataPosition;

    public UploadBulkData(int position){
     this.dataPosition = position;
    }

    @Override
    protected void onPreExecute() {
      super.onPreExecute();
      pDialog = new ProgressDialog(UploadActivity.this);
      pDialog.setMessage("Uploading...");
      pDialog.setIndeterminate(false);
      pDialog.setCancelable(true);
      pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
       .......
       String url = "http://web/uploadBulk.php";
       List<NameValuePair> params = new ArrayList<NameValuePair>();
       params.add(new BasicNameValuePair("UserData", st));

       String resultServer = getHttpPost(url,params); 
       Log.d("Entire string::", " " + resultServer); 

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

      JSONObject jsonObject;
      try { 
        jsonObject = new JSONObject(resultServer); 
        strStatusID = jsonObject.getString("StatusID"); 
        strError = jsonObject.getString("Message"); 
      } catch (JSONException e) { 
        e.printStackTrace();
      } 
   }

   return null;

   }

   protected void onPostExecute(String file_url) {

         pDialog.dismiss();
         fileNameDB=ImageList.get(globalPosition).toString().substring
            (strPath.lastIndexOf('/')+1, strPath.length());

         if(strStatusID.equals("1"))
           {
             Toast.makeText(UploadActivity.this, "Data Uploaded Successfully", Toast.LENGTH_SHORT).show();

            long saveImge = myDbbv.InsertData(fileNameDB);
            Log.d("fileNameDB:UP", String.valueOf(saveImge));
           }
           else
           {   
             Toast.makeText(UploadActivity.this, "Unable to upload Data", Toast.LENGTH_SHORT).show();                                   
           }

           if (file_url != null){
               Toast.makeText(UploadActivity.this, file_url, Toast.LENGTH_LONG).show();
            }
       }
}

在 getView 中我使用的是这样的东西:

public View getView(final int position, View convertView, ViewGroup parent) {

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

try {
    // check data exist or not
    boolean strDataExistU = myDbbv.Exists(fileNameDB);
    if(strDataExistU)
    {
      holder.dataImageView.setImageResource(R.drawable.online);
    }
    else
    {
      boolean strDataExist = myDb.Exists(fileNameDB);
      if(strDataExist)
      {
        holder.dataImageView.setImageResource(R.drawable.local);
      }
      else
      {
      holder.dataImageView.setImageResource(R.drawable.default);
      }
   }                    

   } catch (Exception e) {

   }

  }

正如您在 getView(...) 方法中看到的,我使用了三种不同类型的可绘制对象(即:- 在线、本地、默认)

在线显示数据已经上传到在线服务器,本地显示已经添加到本地数据库和默认..(既没有上传到服务器也没有存储到本地数据库)

问题:

每当我进行批量上传时,只为列表中的最后一行项目获取在线可绘制对象,而我已经将整个列表项数据上传到服务器

我只想显示所有列表项的在线可绘制对象,那些我已经上传到服务器的,否则我的代码工作得很好......

几乎完整的代码

public class UploadActivity extends Activity  { 

        int globalPosition ;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);      

        setContentView(R.layout.activity_upload);

        ImageButton buttonAllData = (ImageButton) findViewById(R.id.btnMenus); 
        buttonAllData.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View arg0) { 
        // TODO Auto-generated method stub 

            new UploadBulkData(globalPosition).execute();

            } 
        });

        /*** Get Images from SDCard ***/
        ImageList = getSD();

        // ListView and imageAdapter
        lstView = (ListView) findViewById(R.id.listView1);
        lstView.setAdapter(new ImageAdapter(this));

        totalItems = ""+ lstView.getAdapter().getCount();
        }

        public static List <String> getSD()
        {
            List <String> it = new ArrayList <String>();
            String string = "/mnt/sdcard/Pictures/Joseph/";
            f = new File (string+ CameraLauncherActivity.folder+ "/");
            files = f.listFiles ();

            /***
             * to show last taken image on top using lastModified
             * to sort data
             * to refresh data after (remove or update)
             */
            Arrays.sort(files, new Comparator<Object>()
            {
                public int compare(Object o1, Object o2) {

                    if (((File)o1).lastModified() > ((File)o2).lastModified()) {
                        return -1;
                    } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
                        return +1;
                    } else {
                        return 0;
                    }
                }
            });
            // <<<<<<<<< END >>>>>>>>>>>

            for (int i = 0; i < files.length; i++)
            {
            file = files[i];
            Log.d("Count",file.getPath());
            it.add (file.getPath());
            }

        return it;  
        }           

        static class ViewHolder {
            public ViewHolder(View convertView) {
                // TODO Auto-generated constructor stub
            }                
            TextView imageNameTextView;
            ImageView sdCardImageView, statusImageView, dataImageView;
            ProgressBar uploadProgressBar;
            ImageButton uploadImageButton, dataImageButton;            
            boolean isUploading = false;           
        }  

         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.dataImageView = (ImageView) convertView.findViewById(R.id.dataExist);

                // 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);

                fileName=ImageList.get(position).toString().substring
            (strPath.lastIndexOf('_')+1, strPath.length());
        fileNameDB=ImageList.get(position).toString().substring
            (strPath.lastIndexOf('/')+1, strPath.length());

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

                options.inSampleSize = 8;

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

                if(holder.isUploading) {                    
                    holder.uploadProgressBar.setVisibility(View.VISIBLE);
                } else {
                    holder.uploadProgressBar.setVisibility(View.GONE);
                }                                                                                       
                holder.dataImageView.setImageResource(R.drawable.bullet_button);

                try {
                    // check data exist or not
                    boolean strDataExistU = myDbbv.Exists(fileNameDB);
                    if(strDataExistU)
                    {
                        holder.dataImageView.setImageResource(R.drawable.online);
                    }
                    else
                    {
                        // check data exist or not
                        boolean strDataExist = myDb.Exists(fileNameDB);
                        if(strDataExist)
                        {
                            holder.dataImageView.setImageResource(R.drawable.database);
                        }
                        else
                        {
                            holder.dataImageView.setImageResource(R.drawable.default);
                        }
                    }                   

                } catch (Exception e) {
                    // TODO: handle exception
                }

                fileName = ImageList.get(position).toString().substring
                        (strPath.lastIndexOf('/')+1, strPath.length());

                try {
                    boolean strExist = myDbb.Exists(fileName);
                    if(strExist)
                    {
                        holder.statusImageView.setImageResource(R.drawable.onl);
                    }
                    else
                    {
                        holder.statusImageView.setImageResource(R.drawable.bullet_button);
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }


                // btnData
                holder.dataImageButton.setOnClickListener(new View.OnClickListener() {
                @SuppressWarnings("deprecation")
                public void onClick(View v) {
                    // Print
                    globalPosition = position;
                    fileName=ImageList.get(position).toString().substring
                            (strPath.lastIndexOf('_')+1, strPath.length());
                    fileNameDB=ImageList.get(position).toString().substring
                            (strPath.lastIndexOf('/')+1, strPath.length());
                    showDialog(DIALOG_LOGIN);
                    }
                });     

        return convertView;

            }   
        }


                        class UploadData extends AsyncTask<String, String, String> {
                            private ProgressDialog pDialog;

                             /**
                            * Before starting background thread Show Progress Dialog
                            * */

                           @Override
                           protected void onPreExecute() {
                               super.onPreExecute();
                               pDialog = new ProgressDialog(UploadActivity.this);
                               pDialog.setMessage("Uploading...");
                               pDialog.setIndeterminate(false);
                               pDialog.setCancelable(true);
                               pDialog.show();                     
                           }

                            @Override
                            protected String doInBackground(String... args) {

                                String url = "http://web/uploadData.php";                                       

                                List<NameValuePair> params = new ArrayList<NameValuePair>();

                                params.add(new BasicNameValuePair("sImageName", fileNameDB));
                                Log.d("sImageName::", fileNameDB);


                                String resultServer  = getHttpPost(url,params);
                                Log.d("Entire string::", " " + resultServer);

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

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

                               return null;

                            }
                            /**
                            * After completing background task Dismiss the progress dialog
                            * **/
                           protected void onPostExecute(String file_url) {
                               // dismiss the dialog once product deleted
                               pDialog.dismiss();

                               try {

                                  fileName=ImageList.get(globalPosition).toString().substring
                                            (strPath.lastIndexOf('_')+1, strPath.length());
                                    fileNameDB=ImageList.get(globalPosition).toString().substring
                                            (strPath.lastIndexOf('/')+1, strPath.length());

                                    // prepare save data
                                    if(strStatusID.equals("0"))
                                    {
                                        Toast.makeText(getApplicationContext(), "Unable to upload Data",
                                                Toast.LENGTH_LONG).show();
                                    }
                                    else if (strStatusID.equals("1"))
                                    {
                                        Toast.makeText(getApplicationContext(), "Data Uploaded Successfully!", 
                                                Toast.LENGTH_SHORT).show();
                                        // Save Data
                                        long saveImge = myDbbv.InsertData(fileNameDB);
                                        Log.d("fileNameDB:UP", String.valueOf(saveImge));
                                    } else {
                                        Toast.makeText(getApplicationContext(), "Unable to upload Data",
                                                Toast.LENGTH_LONG).show();
                                    }

                              } catch (Exception e) {
                                    // TODO: handle exception
                                }


                           if (file_url != null){
                                Toast.makeText(UploadActivity.this, file_url, Toast.LENGTH_LONG).show();
                           }

                       }

                    }


                }); 

                cancelButton.setOnClickListener(new View.OnClickListener(){ 
                    @Override
                        public void onClick(View v) {                           
                        alertDialog.dismiss();
                        }
                });

                closeButton.setOnClickListener(new View.OnClickListener(){ 
                    @Override
                        public void onClick(View v) {                           
                        alertDialog.dismiss();
                        }
                });
            }
        }       


                        class UploadBulkData extends AsyncTask<String, String, String> {
                            private ProgressDialog pDialog;

                            int dataPosition;

                            //constructor to pass position of row, on which button was clicked to class
                            public UploadBulkData(int position){
                                this.dataPosition = position;
                            }

                             /**
                            * Before starting background thread Show Progress Dialog
                            * */

                           @Override
                           protected void onPreExecute() {
                               super.onPreExecute();
                               pDialog = new ProgressDialog(UploadActivity.this);
                               pDialog.setMessage("Uploading...");
                               pDialog.setIndeterminate(false);
                               pDialog.setCancelable(true);
                               pDialog.show();
                           }

                            @Override
                            protected String doInBackground(String... args) {

                                String url = "http://web/uploadBulk.php";

                                List<NameValuePair> params = new ArrayList<NameValuePair>();
                                params.add(new BasicNameValuePair("EventData", st));

                                String resultServer = getHttpPost(url,params); 
                                Log.d("Entire string::", " " + resultServer); 

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

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

                               return null;

                            }
                            /**
                            * After completing background task Dismiss the progress dialog
                            * **/
                           protected void onPostExecute(String file_url) {
                               // dismiss the dialog once product deleted
                               pDialog.dismiss();

                                // Prepare Save Data
                                if(strStatusID.equals("1"))
                                {
                                    Toast.makeText(UploadActivity.this, "Data Uploaded Successfully", Toast.LENGTH_SHORT).show();
                                    fileNameDB=ImageList.get(dataPosition).toString().substring
                                            (strPath.lastIndexOf('/')+1, strPath.length());

                                    // Save Data
                                    long saveImge = myDbbv.InsertData(fileNameDB);
                                    Log.d("fileNameDB:UP", String.valueOf(saveImge));
                                }
                                else
                                {
                                    Toast.makeText(UploadActivity.this, "Unable to upload Data", Toast.LENGTH_SHORT).show();                                    
                                }

                               if (file_url != null){
                                    Toast.makeText(UploadActivity.this, file_url, Toast.LENGTH_LONG).show();
                               }

                           }

            }
android android-listview android-asynctask android-viewholder getview
4个回答
0
投票

问题在 holder.dataImageButton.setOnClickListener 方法块中,您分配给 globalPosition (

globalPosition = position;
) 的位置值是传递给 getView 方法的值(每次回收视图时都会调用 getView)。因此,您应该将位置设置为 holder.dataImageButton 标记,并在 setOnClickListener 方法块中从中检索。

所以在 holder.dataImageButton 标签中设置位置

holder.dataImageButton.setTag(position);

在你的代码行之后

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

并将您的 setOnClickListener 方法修改为

holder.dataImageButton.setOnClickListener(new View.OnClickListener() {
    @SuppressWarnings("deprecation")
    public void onClick(View v) {
        // Print
        globalPosition = (Integer)v.getTag(); //modified
        fileName=ImageList.get(position).toString().substring
                            (strPath.lastIndexOf('_')+1, strPath.length());
        fileNameDB=ImageList.get(position).toString().substring
                            (strPath.lastIndexOf('/')+1, strPath.length());
        showDialog(DIALOG_LOGIN);
    }
});

0
投票

似乎在

UploadData
UploadBulkData
中使用完全相同的代码来更新上传的数据库:
myDbbv.InsertData(fileNameDB)
。这将产生仅将
UploadBulkData
的最后一个文件标记为已上传的效果,这与您看到的有问题的行为一致。

尝试为

myDbbv
中上传的每个文件更新
UploadData
,看看是否有帮助。


0
投票

可以有多种可定制的方法来实现这一点。其中一个已经回答了。如果我对您的要求有误,请纠正我,当列表到达最后一项时,您需要得到通知。之后,您将对最后一个项目索引执行操作。

[更新]

对于此解决方案:您必须迁移到 Recycler View,因为它更灵活、更快速并且针对批量数据进行了优化。

int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition(); // This function could be the one you're looking for.
int findLastCompletelyVisibleItemPosition();

用法:

// In Java

GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();

参考资料:https://stackoverflow.com/a/25053500/16176653


0
投票

直接使用

ImageList.get(position).toString()
代替
strPath = ImageList.get(position).toString()

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.