1

남자들은 내 progressDialog에 약간의 문제가 있습니다. 올바른 방식으로 작동하지 않습니다. 글라이드를 사용하여 많은 그림을로드하기 때문에 내 progressDialog가 RecylerView 어댑터 안에 있습니다. Glide를 사용할 때 progressDialog를 표시하는 유일한 방법이었습니다. progressDialog를 Asynctask proExecute로 이동하고 postExecute는 doinBackground 작업이 수행 중이거나 숨겨져있을 때만 표시됩니다. 그러나 Glide는 여전히 사진을로드 중입니다. 필자가 작성한 것처럼, 어댑터에 넣고 그림이로드 될 때까지 숨겨진 솔루션이 이상하게 작동합니다. 때때로 나는 앱을 실행할 때 progressdialog없이 사진을로드 할 때까지 기다려야하며 때로는 짧은 시간 동안 보여야합니다. 그것을 해결하는 방법? 내 상황에서 progressDialog를 사용하는 가장 좋은 방법은 무엇입니까?Asynctask 및 RecyclerView 어댑터 안드로이드 ProgressDialog

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

내 어댑터 클래스 :

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

답변

0

가장 쉬운 방법은 이미지 뷰 뒤에 진행 막대를 표시하는 것입니다. RelativeLayout에 ImageView와 ProgressBar를 모두 추가하십시오. 이미지가로드되면 자동으로 진행 표시 줄이 숨겨집니다. 바로 가기 : 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> 

이미지를로드하고 진행 표시 줄에 대해 아무 것도하지 마십시오.

+0

위대한 이미지가로드되었을 때 어떻게 알림을받을 수 있습니까? –

+0

그럴 필요가 없습니다. 이미지가 그 위에로드 된 후에는 사라진 것처럼 보입니다. –

+0

이 레이아웃이 어떻게 보이는지 샘플을 보여줄 수 있습니까? 나는 혼란스럽고 어떻게 작동하는지 상상할 수 없다 ... –