1

Jungs Ich habe ein kleines Problem mit meinem progressDialog. Es funktioniert nicht richtig. Mein progressDialog befindet sich im RecylerView Adapter, weil ich viele Bilder mit Glide geladen habe. Es war nur möglich, progressDialog zu zeigen, wenn ich Glide benutze - wenn ich progressDialog in Asynctask proExecute verschiebe und postExecute es nur zeige, wenn doinBackground Job tut und versteckt. Aber Glide lädt immer noch Bilder. Wie ich geschrieben habe, funktioniert meine Lösung, es in Adapter und mit ausblenden bis Bilder laden, seltsam. Manchmal, wenn ich app laufe, muss ich warten, bis das Bild geladen wird ohne progressdialog, manchmal zeigt es für kurze Zeit. Wie man es löst? Was ist der beste Weg, um progressDialog in meiner Situation zu verwenden?Android ProgressDialog innerhalb Asynctask und RecyclerView Adapter

Mein MainActivity:

public class MainActivity extends AppCompatActivity { 

    List<String> shopsNames; 
    ArrayList<RowModel> rowModels; 

    public Realm mRealm; 
    @BindView(R.id.toolbar_layout) 
    CollapsingToolbarLayout toolbarLayout; 
    @BindView(R.id.app_bar) 
    AppBarLayout appBar; 
    private ShopsAdapter adapter; 
    @BindView(R.id.recycler_view) 
    RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 
     ButterKnife.bind(this); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ConnectionDetector connectionDetector = new ConnectionDetector(this); 
     if (!connectionDetector.isConnection()) { 
      finish(); 
     } 

     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 123); 



     rowModels = new ArrayList<>(); 
     shopsNames = new ArrayList<>(); 
     Realm.init(this); 

     mRealm = Realm.getDefaultInstance(); 

     initCollapsingToolbar(); 

     Glide.with(getApplicationContext()).load(R.drawable.shoplogo). 
       into((ImageView) findViewById(R.id.backdrop)); 

     adapter = new ShopsAdapter(MainActivity.this, shopsNames); 

     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(adapter); 

     AsyncTaskRetro asyncTaskRetro = new AsyncTaskRetro(); 
     asyncTaskRetro.execute(); 
    } 

    private class AsyncTaskRetro extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... voids) { 

      PlacesAPI.Factory.getInstance().getPlaces().enqueue(new Callback<Places>() { 

       @Override 
       public void onResponse(Call<Places> call, Response<Places> response) { 
        for (int i = 0; i < response.body().getPosts().size(); i++) { 
         RowModel rowModel = new RowModel(response.body().getPosts().get(i).getNazwa(), 
           Double.parseDouble(response.body().getPosts().get(i).getSzer()), 
           Double.parseDouble(response.body().getPosts().get(i).getDlug())); 
         rowModels.add(rowModel); 
        } 
        String oldName; 
        oldName = rowModels.get(0).getName(); 
        shopsNames.add(rowModels.get(0).getName()); 

        mRealm.beginTransaction(); 
        mRealm.copyToRealm(rowModels); 
        mRealm.commitTransaction(); 

        for (int j = 0; j < rowModels.size(); j++) { 

         if (rowModels.get(j).getName().equals(oldName)) { 
          continue; 
         } 
         oldName = rowModels.get(j).getName(); 
         shopsNames.add(rowModels.get(j).getName()); 
        } 

        //sortowanie listy z nazwami sklepow 
        Collections.sort(shopsNames); 

        adapter = new ShopsAdapter(MainActivity.this, shopsNames); 
        recyclerView.setAdapter(adapter); 
       } 

       @Override 
       public void onFailure(Call<Places> call, Throwable t) { 

       } 
      }); 

      return null; 
     } 
    } 

    private void initCollapsingToolbar() { 
     final CollapsingToolbarLayout collapsingToolbar = 
       (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout); 
     collapsingToolbar.setTitle(" "); 
     AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.app_bar); 
     appBarLayout.setExpanded(true); 

     // hiding & showing the title when toolbar expanded & collapsed 
     appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
      boolean isShow = false; 
      int scrollRange = -1; 

      @Override 
      public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
       if (scrollRange == -1) { 
        scrollRange = appBarLayout.getTotalScrollRange(); 
       } 
       if (scrollRange + verticalOffset == 0) { 
        collapsingToolbar.setTitle(getString(R.string.app_name)); 
        isShow = true; 
       } else if (isShow) { 
        collapsingToolbar.setTitle(" "); 
        isShow = false; 
       } 
      } 
     }); 
    } 
} 

My Adapter Klasse:

public class ShopsAdapter extends RecyclerView.Adapter<ShopsAdapter.MyViewHolder> { 

    Context mContext; 
    List<String> shopsList; 
    ProgressDialog progressDialog; 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public ImageView thumbnail; 

     public MyViewHolder(View view) { 
      super(view); 
      thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 
     } 
    } 

    public ShopsAdapter(Context mContext, List<String> shopsList) { 
     this.mContext = mContext; 
     this.shopsList = shopsList; 

     progressDialog = new ProgressDialog(mContext); 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.shop_card, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 

     shopsList.get(position); 
     try { 
      progressDialog.show(); 
      progressDialog.setMessage("Czekaj..."); 
      String stringformat = String.format("http://www.wp.pl%s.png", shopsList.get(position)); 
      Glide.with(mContext).load(stringformat).listener(new RequestListener<String, GlideDrawable>() { 
       @Override 
       public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
        Log.d("fsfsdf", e.getMessage()); 
        return false; 
       } 

       @Override 
       public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
        progressDialog.hide(); 
        return false; 
       } 
      }).centerCrop().fitCenter().into(holder.thumbnail); 
     } catch (Exception e) { 
      Glide.with(mContext).load("http://www.wp.pl/Zabka.png").centerCrop().fitCenter().into(holder.thumbnail); 
     } 

     holder.thumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //Log.d("Nazwa sklepu: ", shopsList.get(position)); 
       Intent intent = new Intent(mContext, MapActivity.class); 
       intent.putExtra("shopName", shopsList.get(position)); 
       mContext.startActivity(intent); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return shopsList.size(); 
    } 
} 

Antwort

0

Der einfachste Weg ist progressbar hinter dem Imageview zu zeigen. Fügen Sie ImageView und ProgressBar zu RelativeLayout hinzu. Wenn das Bild geladen wird, wird die Fortschrittsanzeige automatisch ausgeblendet. Abkürzung: D

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <ProgressBar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" /> 

    <ImageView 
     android:layout_width="200dp" 
     android:layout_height="200dp" /> 
</RelativeLayout> 

Laden Sie einfach Bild und nichts über Progressbar.

+0

großartig, aber wie wird benachrichtigt, wenn das Bild geladen wurde? –

+0

Keine Notwendigkeit dafür. Es sieht so aus, als wäre es weg, nachdem das Bild darauf geladen wurde. –

+0

könnten Sie ein Beispiel zeigen, wie dieses Layout aussehen soll? Ich bin verwirrt und ich kann mir nicht vorstellen, wie es funktioniert ... –

Verwandte Themen