简体   繁体   English

Android 进度条无法正常工作

[英]Android progress bar not working properly

I am trying to fetch a list of earthquakes using an API.我正在尝试使用 API 获取地震列表。 All I want is that, if internet connection is not available, the screen must tell about it to the user, else while data has not yet been fetched, a progress bar should show up to let the user know that fetching is in progress and when done fetching, the progress bar goes away and the recycler view displays the list of earthquakes.我想要的是,如果互联网连接不可用,屏幕必须告诉用户它,否则当数据尚未被提取时,应该显示一个进度条让用户知道正在提取以及何时完成提取,进度条消失,回收站视图显示地震列表。 But for some reason, the progress bar is now working properly.但出于某种原因,进度条现在可以正常工作。 Either it doesn't show up at all or if it does, it doesn't go away .要么它根本不出现,要么如果出现了,它就不会消失。 Here is my Main Activity class:这是我的主要活动类:


public class EarthquakeActivity extends AppCompatActivity {

    private MyModel mMyModel;
    private ViewModelProvider mViewModelProvider;
    private RecyclerView mRecyclerView;
    private TextView mEmptyView;
    private EarthquakeAdapter mEarthquakeAdapter;
    private ProgressBar mProgressBar;
    private ConnectivityManager mConnectivityManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.earthquake_activity);
        mEmptyView = findViewById(R.id.empty_view);
        // get the progress bar to indicate loading
        mProgressBar = findViewById(R.id.loading_bar);
        // set a view model provider for the current activity
        mViewModelProvider = new ViewModelProvider(this);
        // get the view model for the class
        mMyModel = mViewModelProvider.get(MyModel.class);
        // find a reference to the {@link RecyclerView} in the layout
        mRecyclerView = findViewById(R.id.earthquakes);
        mConnectivityManager = getSystemService(ConnectivityManager.class);
        mEmptyView.setText("No internet available");
        mEmptyView.setVisibility(View.VISIBLE);
        Handler handler = new Handler(Looper.getMainLooper());
        mConnectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
            @Override
            public void onAvailable(Network network) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        mEmptyView.setVisibility(View.GONE);
                        mProgressBar.setVisibility(View.VISIBLE);
                        fetchData();
                    }
                });
            }
        });
        mProgressBar.setVisibility(View.GONE);// hide the progress bar
        mRecyclerView.setVisibility(View.VISIBLE);// make the recycler view visible
    }

    private void fetchData(){
        // fetch the list of earthquakes
        mMyModel.getEarthquakes().observe(EarthquakeActivity.this, new Observer<ArrayList<Earthquake>>() {
            @Override
            public void onChanged(ArrayList<Earthquake> earthquakes) {
                // set up recycler view with this data, this will work even if you rotate the device
                setUpRecyclerView(earthquakes);
            }
        });
    }

    private void setUpRecyclerView(ArrayList<Earthquake> earthquakes) {
        if(earthquakes == null || earthquakes.size() == 0) {
            mRecyclerView.setVisibility(View.GONE);
            mProgressBar.setVisibility(View.GONE);
            mEmptyView.setText(R.string.no_data_available);
            mEmptyView.setVisibility(View.VISIBLE);
        }
        else {
            mRecyclerView.setVisibility(View.VISIBLE);
            mEmptyView.setVisibility(View.GONE);
            // create adapter passing in the earthquake data
            mEarthquakeAdapter = new EarthquakeAdapter(EarthquakeActivity.this, earthquakes);
            // attach the adapter to the recyclerView to populate the items
            mRecyclerView.setAdapter(mEarthquakeAdapter);
            // set the layout manager to position the items
            mRecyclerView.setLayoutManager(new LinearLayoutManager(EarthquakeActivity.this));
            // click listener for when an item is clicked
            mEarthquakeAdapter.setClickListener((view, position) -> searchWeb(earthquakes.get(position).getUrl()));
        }
    }

    private void searchWeb(String url) {
        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
        intent.putExtra(SearchManager.QUERY,url);
        if(intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }
}

and my recycler view xml file和我的回收商查看 xml 文件

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/earthquakes"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:visibility="gone"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/empty_view"
        android:layout_centerInParent="true"
        android:visibility="gone"
        android:textAppearance="?android:textAppearanceMedium"
        android:text="@string/no_data_available"
        />
    <ProgressBar
        android:id="@+id/loading_bar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminate="true"
        android:visibility="gone"
        />


</RelativeLayout>

In case needed, here is my MyModel.java file which itself was a herculean task to setup properly如果需要,这里是我的 MyModel.java 文件,它本身是一项艰巨的任务才能正确设置

public class MyModel extends ViewModel {

    private static final String LOG_TAG = "MyModel";
    public MutableLiveData<ArrayList<Earthquake>> mMutableLiveData;
    public ArrayList<Earthquake> mEarthquakes;

    public MutableLiveData<ArrayList<Earthquake>> getEarthquakes() {
        mMutableLiveData = new MutableLiveData<>();
        // call the API
        init();
        return mMutableLiveData;
    }

    public void init() {
        // perform the network request on separate thread
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                // create array list of earthquakes
                mEarthquakes = QueryUtils.fetchEarthquakeData("https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2021-06-01&limit=300");
                mMutableLiveData.postValue(mEarthquakes);
            }
        });
        executorService.shutdown();

    }


}

Please explain what I am doing wrong.请解释我做错了什么。 I recently learnt multithreading and API basics so I don't have any idea about my mistake.我最近学习了多线程和 API 基础知识,所以我对自己的错误一无所知。 I would appreciate the help.我将不胜感激。

Try to change this in your MainActivity =>尝试在您的 MainActivity 中更改此设置 =>

mConnectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
        @Override
        public void onAvailable(Network network) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    
                    fetchData();
                }
            });
        }
    }).addOnCompleteListener(new View.OnCompleteListener) {
       mEmptyView.setVisibility(View.GONE);
                    mProgressBar.setVisibility(View.VISIBLE);});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM