Mostrar el estado del último elemento de la lista en un ListView usando ViewHolder

11 minutos de lectura

Avatar de usuario de Sun
Sol

    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("https://stackoverflow.com/")+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();
            }
       }
}

Y en getView estoy usando algo como esto:

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) {

   }

  }

Como puede ver en el método getView (…), estoy usando tres tipos diferentes de dibujables (a saber: en línea, local, predeterminado)

Cuando los datos de programas en línea se cargaron en el servidor en línea, los programas locales se agregaron a la base de datos local y por defecto … (ni se cargaron en el servidor ni se almacenaron en la base de datos local)

Problema:

Cada vez que realizo una carga masiva, me conecto en línea solo para el elemento de la última fila en una lista, mientras que he cargado datos de elementos de lista completos en el servidor

Solo quiero mostrar el diseño en línea para todos los elementos de la lista, los que he subido al servidor, de lo contrario, mi código funciona bien…

Casi código completo:

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+ "https://stackoverflow.com/");
            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("https://stackoverflow.com/")+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("https://stackoverflow.com/")+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("https://stackoverflow.com/")+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("https://stackoverflow.com/")+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("https://stackoverflow.com/")+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();
                               }

                           }

            }

  • en onPostExecute se supone que debes usar dataPosition en lugar de globalPosition

    – Bharatsh

    18 de abril de 2015 a las 11:27

  • También lo intenté con dataPosition, pero obtuve el mismo resultado.

    – Sol

    20 de abril de 2015 a las 5:04

  • Deberías pasar un Holder objetar a su AsycnTask.

    – Piyush

    21 de abril de 2015 a las 9:45

  • posible duplicado de ListView Data se borró al desplazarse

    usuario4387624

    28 de abril de 2015 a las 6:37

  • Su código tiene muchos errores, es decir (en getView () ha inicializado un objeto en nulo “holder = null” sin tipo, sé que es ViewHolder y ¿qué es la bandera? ¿Y de dónde es?) si proporciona el correcto código intentaré encontrar el problema.

    – Vigneshwaran.m

    7 de mayo de 2015 a las 5:37

El problema está en el bloque de método holder.dataImageButton.setOnClickListener, el valor de posición que está asignando a globalPosition (globalPosition = position;) es el que se pasa al método getView (se llama a getView cada vez que se recicla la vista). Por lo tanto, debe establecer la posición en la etiqueta holder.dataImageButton y recuperarla dentro de su bloque de método setOnClickListener.

Así que establezca la posición en la etiqueta holder.dataImageButton

holder.dataImageButton.setTag(position);

después de su línea de código

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

y modifique su método setOnClickListener como

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("https://stackoverflow.com/")+1, strPath.length());
        showDialog(DIALOG_LOGIN);
    }
});

  • pero estoy enfrentando un problema, cuando solo hago una carga masiva: verifique UploadBulkData

    – Sol

    22 de abril de 2015 a las 4:58

  • Mientras llama a UploadBulkData, está pasando el valor globalPosition, es decir, un valor único. O tiene que crear un bucle en el bloque del método buttonAllData.setOnClickListener, o puede pasar una matriz completa de archivos para cargarlos en UploadBulkData asynctask y crear un bucle dentro del método doInBackground.

    – Rajen Raiyarela

    22 de abril de 2015 a las 6:53

  • lo he intentado, puede mostrarme el camino… esto es lo único que no he logrado en mi aplicación, y pasé alrededor de 4 días con esto… pero espero que puedas resolver mi problema en unos minutos, amigo, he dado lo mejor de mí .. ayúdame a hacerlo

    – Sol

    22 de abril de 2015 a las 11:35

  • Todavía enfrenta el mismo problema

    – Sol

    28 de abril de 2015 a las 10:24

Parece que en ambos UploadData y UploadBulkData se utiliza exactamente el mismo código para actualizar la base de datos cargada: myDbbv.InsertData(fileNameDB). Esto tendría el efecto de marcar sólo el último archivo de UploadBulkData como siendo cargado, lo cual es consistente con el comportamiento problemático que está viendo.

Intenta actualizar myDbbv por cada archivo que se cargue en UploadData y ver si ayuda.

Avatar de usuario de Puneet Verma
Puneet Verma

Podría haber múltiples formas personalizables para lograr esto. Uno de ellos ya está respondido. Corríjame si me equivoco con respecto a su requisito, debe recibir una notificación cuando la lista llegue a su último elemento. Luego, realizará una operación con el índice del último elemento.

[UPDATE]

Para esta solución: debe migrar a Recycler View, ya que es más flexible, rápido y está optimizado para datos masivos.

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

Uso:

// In Java

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

Referencia: https://stackoverflow.com/a/25053500/16176653

Use este “ImageList.get(position).toString()” directo. en lugar de ” strPath = ImageList.get(position).toString()”;

¿Ha sido útil esta solución?