viewholder android android-listview android-asynctask android-viewholder getview

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



adapter viewholder (2)

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 del 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(''/'')+1, strPath.length()); showDialog(DIALOG_LOGIN); } });

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(); } } }

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 elementos dibujables (a saber: en línea, local, predeterminado)

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

Problema:

Cada vez que hago una carga masiva, puedo dibujar en línea solo para el último elemento de la fila en una lista, mientras que he cargado datos completos del elemento de la lista en el servidor

Solo quiero mostrar el dibujo en línea para todos los elementos de la lista, aquellos que he cargado en el servidor, de lo contrario mi código funciona bien ...

Código casi 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+ "/"); 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(); } } }


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

Intente actualizar myDbbv para cada archivo que se está cargando en UploadData y vea si ayuda.