Anzeigen des Status für das letzte Listenelement in einer ListView mit ViewHolder

Lesezeit: 11 Minuten

Benutzeravatar von Sun
Sonne

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

Und in getView verwende ich so etwas:

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

   }

  }

Wie Sie in der Methode getView(…) sehen können, verwende ich drei verschiedene Arten von Drawables (nämlich: – online, lokal, Standard)

Wo Online-Shows-Daten auf den Online-Server hochgeladen wurden, wurden lokale Shows zur lokalen Datenbank und Standard hinzugefügt. (weder auf den Server hochgeladen noch in der lokalen Datenbank gespeichert)

Problem:

Immer wenn ich einen Massen-Upload durchführe, werde ich nur für das letzte Zeilenelement in einer Liste online darstellbar, während ich ganze Listenelementdaten auf den Server hochgeladen habe

Ich möchte nur online Drawable für alle Listenelemente anzeigen, die ich auf den Server hochgeladen habe, sonst funktioniert mein Code einwandfrei …

Fast vollständiger Code:

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

                           }

            }

  • In onPostExecute Sie nehmen an zu verwenden dataPosition anstatt globalPosition

    – Bharatasch

    18. April 2015 um 11:27 Uhr

  • Ich habe es auch mit dataPosition versucht, aber das gleiche Ergebnis erhalten

    – Sonne

    20. April 2015 um 5:04 Uhr

  • Sie sollten a bestehen Holder widersprechen AsycnTask.

    – Pijusch

    21. April 2015 um 9:45 Uhr

  • Mögliches Duplikat von ListView-Daten wurde beim Scrollen gelöscht

    Benutzer4387624

    28. April 2015 um 6:37 Uhr

  • Ihr Code hat viele Fehler, dh (in getView () haben Sie ein Objekt auf null “holder = null” initialisiert, ohne dass ich weiß, dass es ViewHolder ist und was ein Flag ist? und woher es kommt?), wenn Sie das Richtige angeben Code Ich werde versuchen, das Problem zu finden.

    – Vigneshwaran.m

    7. Mai 2015 um 5:37 Uhr

Das Problem befindet sich im Methodenblock holder.dataImageButton.setOnClickListener, Positionswert, den Sie globalPosition zuweisen (globalPosition = position;) wird an die getView-Methode übergeben (getView wird jedes Mal aufgerufen, wenn die Ansicht wiederverwendet wird). Sie sollten also die Position auf das Tag holder.dataImageButton setzen und es in Ihrem setOnClickListener-Methodenblock abrufen.

Legen Sie also die Position im Tag holder.dataImageButton fest

holder.dataImageButton.setTag(position);

nach Ihrer Codezeile

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

und ändern Sie Ihre setOnClickListener-Methode als

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

  • aber ich habe ein Problem, wenn ich nur einen Bulk-Upload durchführe – überprüfen Sie UploadBulkData

    – Sonne

    22. April 2015 um 4:58 Uhr

  • Beim Aufrufen von UploadBulkData übergeben Sie den globalPosition-Wert, dh einen einzelnen Wert. Entweder müssen Sie eine Schleife im Methodenblock buttonAllData.setOnClickListener erstellen, oder Sie können ein vollständiges Array von Dateien übergeben, die an die asynchrone Aufgabe UploadBulkData hochgeladen werden sollen, und eine Schleife in der Methode doInBackground erstellen.

    – Rajen Raiyarela

    22. April 2015 um 6:53 Uhr

  • Ich habe versucht, mir den Weg zu zeigen. Das ist das einzige, was ich in meiner App nicht erreicht habe, und habe ungefähr 4 Tage damit verbracht. Aber ich hoffe, Sie können mein Problem innerhalb weniger Minuten lösen, Freund, ich habe mein Bestes gegeben .. hilf mir, es zu erledigen

    – Sonne

    22. April 2015 um 11:35 Uhr

  • Stehe immer noch vor dem gleichen Problem

    – Sonne

    28. April 2015 um 10:24 Uhr

Das scheint bei beiden der Fall zu sein UploadData Und UploadBulkData der exakt gleiche Code wird zum Aktualisieren der hochgeladenen Datenbank verwendet: myDbbv.InsertData(fileNameDB). Dies hätte zur Folge, dass nur die letzte Datei von markiert wird UploadBulkData als hochgeladen, was mit dem problematischen Verhalten übereinstimmt, das Sie sehen.

Versuchen Sie eine Aktualisierung myDbbv für jede hochgeladene Datei UploadData und sehen, ob es hilft.

Benutzeravatar von Puneet Verma
Puneet Verma

Es könnte mehrere anpassbare Möglichkeiten geben, dies zu erreichen. Eine davon ist bereits beantwortet. Korrigieren Sie mich, wenn ich mit Ihrer Anforderung falsch liege. Sie müssen benachrichtigt werden, wenn die Liste ihr letztes Element erreicht hat. Anschließend führen Sie eine Operation mit dem letzten Elementindex durch.

[UPDATE]

Für diese Lösung: Sie müssen zu Recycler View migrieren, da es flexibler, schneller und für Massendaten optimiert ist.

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

Verwendung:

// In Java

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

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

Verwenden Sie diese “ImageList.get(position).toString()” Direct. statt “strPath = ImageList.get(position).toString()”;

1448640cookie-checkAnzeigen des Status für das letzte Listenelement in einer ListView mit ViewHolder

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy