Firebase Realtime DB - как показать индикатор выполнения при просмотре изображения, пока изображение не загрузится и не исчезнет, ​​как только изображение будет успешно загружено? - PullRequest
0 голосов
/ 31 марта 2019

В моем приложении для Android я хочу добавить индикатор прогресса для каждого изображения во время загрузки изображений из базы данных Firebase Relaytime. После успешной загрузки изображения мне нужно сделать индикатор невидимым.

Пожалуйста, помогите с кодом.

Я разработал код Android для извлечения изображения и текста из базы данных Firebase Relaytime с использованием представления переработчика и просмотра карты.

XML:

<ImageView
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:scaleType="centerCrop"
            android:id="@+id/post_image" />
        <ProgressBar
            android:layout_width="match_parent"
            android:layout_height="75dp"
            android:layout_marginTop="60dp"/>

Основная деятельность.java

public class MainActivity extends AppCompatActivity {

    private RecyclerView mBloglist;
    private DatabaseReference mDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDatabase = FirebaseDatabase.getInstance().getReference().child("Industries");
        mDatabase.keepSynced(true);
        mBloglist = (RecyclerView)findViewById(R.id.myrecycleview);
        mBloglist.setHasFixedSize(true);
        mBloglist.setLayoutManager(new LinearLayoutManager(this));

    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<Industry, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Industry, BlogViewHolder>
                (Industry.class, R.layout.blog_row, BlogViewHolder.class, mDatabase) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, Industry model, int position) {

                viewHolder.setTitle(model.getIndustryName());
                viewHolder.setDesc(model.getIndustryDesc());
                viewHolder.setImage(getApplicationContext(),model.getIndustryImage());

            }
        };
        mBloglist.setAdapter(firebaseRecyclerAdapter);

    }

    public static class BlogViewHolder extends RecyclerView.ViewHolder
    {
        View mView;

        public BlogViewHolder(View itemView)
        {
            super(itemView);
            mView=itemView;
        }

        public void setTitle(String title)
        {
            TextView post_title = (TextView)mView.findViewById(R.id.post_title);
            post_title.setText(title);
        }

        public void setDesc(String desc)
        {
            TextView post_desc = (TextView)mView.findViewById(R.id.post_desc);
            post_desc.setText(desc);
        }

        public void setImage(Context ctx, String image)
        {
           ImageView post_Image = (ImageView)mView.findViewById(R.id.post_image);
            Picasso.with(ctx).load(image).into(post_Image);

        }
    }
}

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Для этой цели вы можете использовать функцию обратного вызова Picasso. Добавьте индикатор прогресса над вашим изображением в макете, а затем измените функцию setImage

public void setImage(Context ctx, String image)
{
   ProgressBar mProgress = (ProgressBar) mView.findViewById(R.id.imageProgress);
   mProgress.show();
   ImageView post_Image =(ImageView)mView.findViewById(R.id.post_image);
   Picasso.with(ctx).load(image).into(post_Image, new com.squareup.picasso.Callback() {
     @Override
     public void onSuccess() {
       //Image loaded successfully, now dismiss progress bar.
       mProgress.dismiss();
     }

     @Override
     public void onError() {
       //Image Not Loaded properly
       Picasso.with(ctx).load(errorImage).into(post_Image);
     }
   });
}
0 голосов
/ 31 марта 2019

Вы должны использовать свойство видимости индикатора выполнения. Сначала добавьте свой индикатор выполнения в макет и сделайте его видимость «Visibility.GONE». Затем, когда вы начнете скачивать, сделайте видимость Visibility.VISIBLE. После окончания загрузки сделайте видимость «Visibility.GONE».

0 голосов
/ 31 марта 2019

попробуйте это, не уверен, что это работает.

  1. добавьте идентификатор в ваш индикатор выполнения в XML.для примера, давайте предположим, что его идентификатор - progressBar.

решение 1: сделать индикатор выполнения глобальным и создать его экземпляр в методе onCreate.

 FirebaseRecyclerAdapter<Industry, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Industry, BlogViewHolder>
            (Industry.class, R.layout.blog_row, BlogViewHolder.class, mDatabase) {
        @Override
        protected void populateViewHolder(BlogViewHolder viewHolder, Industry model, int position) {
            mProgressbar.show();
            viewHolder.setTitle(model.getIndustryName());
            viewHolder.setDesc(model.getIndustryDesc());
            viewHolder.setImage(getApplicationContext(),model.getIndustryImage());
            mProgressBar.dismiss();
        }
    };
    mBloglist.setAdapter(firebaseRecyclerAdapter);

Решение 2: объявить индикатор выполненияв BlogViewHolder в видоискателе

public void setImage(Context ctx, String image)
    {
       mProgressbar.show();
       ImageView post_Image = (ImageView)mView.findViewById(R.id.post_image);
       Picasso.with(ctx).load(image).into(post_Image);
       mProgressbar.dismiss();
    }
...