【问题标题】:How to show progress bar while loading ListView?加载ListView时如何显示进度条?
【发布时间】:2016-07-14 19:05:03
【问题描述】:

我正在从 Firebase 数据库加载 ListView,我希望它在加载 ListView 时会显示一个进度条。

我已经阅读了一些指南并尝试了一些方法,但它对我不起作用。

这是我的代码:

public class Event_List_Activity extends Activity {
private static final String FIREBASE_URL="https://****.firebaseio.com/";
private Firebase firebaseRef;
final ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_event__list_);
    Firebase.setAndroidContext(this);
    firebaseRef = new Firebase(FIREBASE_URL);

    //populateEventList();
    new MyTask().execute();

    final ListView listView = (ListView)findViewById(R.id.listView1);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            openEventInfo(parent,view,position,id);

    }
    });

}



class MyTask extends AsyncTask<String,Integer,String>
{

@Override
protected void onPreExecute()
{
    super.onPreExecute();
}

@Override
protected String doInBackground(String...strings)
{
    populateEventList();
    return null;
}

@Override
protected void onProgressUpdate(Integer...values)
{
    super.onProgressUpdate(values);
    pb.setProgress(values[0]);

}

@Override
protected void onPostExecute(String s)
{
    super.onPostExecute(s);
}
}





private void populateEventList()
{
    firebaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {


            ArrayList<String> subTitles = new ArrayList<String>();
            ArrayList<EventClass> eventList = new ArrayList<EventClass>();
            ArrayList<String> titles = new ArrayList<String>();
            for (DataSnapshot user : snapshot.child("users").getChildren()) {

                String event_title = user.child("event/event_title").getValue().toString();

                String event_date = user.child("event/event_date").getValue().toString();
                subTitles.add(event_date);
                String event_content = user.child("event/event_content").getValue().toString();
                String age_limit = user.child("event/age_limit").getValue().toString();
                String event_hour = user.child("event/event_hour").getValue().toString();
                String location_left = user.child("location_left").getValue().toString();
                String location_right = user.child("location_right").getValue().toString();

                EventClass oneEvent = new EventClass(event_title, event_date, event_content, age_limit, event_hour, location_left, location_right);
                eventList.add(oneEvent);

            }


            for (EventClass event : eventList) {
                titles.add(event.getEvent_title());
            }
            ArrayAdapter adapter = new ArrayAdapter(Event_List_Activity.this, android.R.layout.simple_list_item_1, titles) {

                @Override
                public View getView(int position, View convertView,
                                    ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);

                    TextView textView = (TextView) view.findViewById(android.R.id.text1);
                    textView.setTextColor(Color.WHITE);

                    return view;
                }
            };
            ListView listView = (ListView) findViewById(R.id.listView1);

            listView.setAdapter(adapter);


        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            String message = "Error";
            Toast.makeText(Event_List_Activity.this, message, Toast.LENGTH_SHORT).show();
        }
    });

}

private void openEventInfo(AdapterView<?> parent, View view, int position, long id)
{
    final String selectedTitle = parent.getItemAtPosition(position).toString();
    firebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot user : dataSnapshot.child("users").getChildren()) {
                String event_title = user.child("event/event_title").getValue().toString();
                if (selectedTitle.equals(event_title)) {

                    String event_date = user.child("event/event_date").getValue().toString();
                    String event_content = user.child("event/event_content").getValue().toString();
                    String age_limit = user.child("event/age_limit").getValue().toString();
                    String event_hour = user.child("event/event_hour").getValue().toString();
                    String location_left = user.child("location_left").getValue().toString();
                    String location_right = user.child("location_right").getValue().toString();
                    final SharedPreferences sp = getSharedPreferences("key", 0);
                    final SharedPreferences.Editor sedt = sp.edit();

                    sedt.putString("event_title", event_title);
                    sedt.putString("event_date", event_date);
                    sedt.putString("event_content", event_content);
                    sedt.putString("age_limit", age_limit);
                    sedt.putString("event_hour", event_hour);
                    sedt.putString("location_left", location_left);
                    sedt.putString("location_right", location_right);

                    sedt.commit();

                }

            }
            Intent intent = new Intent(Event_List_Activity.this, EventInfo.class);
            startActivity(intent);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(Event_List_Activity.this, "Error", Toast.LENGTH_LONG).show();
        }
    });

}




}

阅读评论后,这是我在MyTask() 方法中所做的更改:

class MyTask extends AsyncTask<String,Integer,String>
{

@Override
protected void onPreExecute()
{
    super.onPreExecute();
    listView.setVisibility(View.INVISIBLE);
    pb.setVisibility(View.VISIBLE);
}

@Override
protected String doInBackground(String...strings)
{
    populateEventList();
    return null;
}

@Override
protected void onProgressUpdate(Integer...values)
{
    super.onProgressUpdate(values);
    pb.setProgress(values[0]);
    pb.setMax(values[1]);


}

@Override
protected void onPostExecute(String s)
{
    super.onPostExecute(s);
    pb.setVisibility(View.GONE);
    listView.setVisibility(View.VISIBLE);
}
}

【问题讨论】:

    标签: android listview progress-bar


    【解决方案1】:

    您必须在某处手动调用publishProgress 中的doInBackground AsyncTask publishProgress

    编辑:

    让我更具体一点... 如果您只想在加载数据时显示进度条,您可以这样做。

    onPreExecute 中,您可以隐藏listView 并将progressBarvisibility 设置为VIEW.VISIBLE

    然后在doInBackground 中,每次您收到一个新数据集时,您调用publishProgress(current, max) 可能会包含当前接收数据的数量和最大数量。

    然后在onProgressUpdate(Integer... values) 中通过pb.setMax(values[1]) 和实际值pb.setProgress(values[0]) 设置新的Max-Value。

    加载每个数据集后,onPostExecute() 将被调用,您将progressBar 的可见性更改回VIEW.GONE,并将ListView 的可见性设置回VIEW.VISIBLE

    【讨论】:

    • 您好,首先感谢您的评论!其次,我不明白在你写的Then in doInBackground each time you receive a new data set you call publishProgress(current, max) with maybe the current number of received data and the max amount. 的行中做什么,电流是多少,最大值是多少?你说每次我收到一个新数据集是什么意思?
    • 顺便说一句,我已将上面的代码更改添加到我的问题中。
    • 所以我对 Firebase 数据库一无所知。但是由于您已经定义了FIREBASE_URL,我假设您正在通过互联网接收数据。那么好吧——在您的populateEventList 中,您正在从数据库接收数据。然后我想刷新progressBar,通过使用当前接收到的事件数(您在eventList 中实际收到的事件数)和数据库中的最大事件数(可能类似于snapshot.child("users").getChildren().Lenght)。
    • 这个问题被问到在使用 firebase 进行长时间运行的操作(如下载文件或其他任何操作)时显示进度。 Firebase 已经在不同的线程上工作。所以使用 AsyncTask 并不能解决问题。
    【解决方案2】:

    FireBase 对每项任务都有完整的解决方案。以下是我们将如何在下载或上传内容时显示进度。如this blog 所述,我们可以使用FireBase API 的内置方法。

    首先请删除所有 AsyncTask 代码,以便下载和显示进度。 FireBase 已经在其他线程上工作,因此不需要 AsyncTask。所以你做了这样的事情

    StorageReference storageRef = FirebaseStorage.getInstance().reference().child("folderName/file.jpg");
    Uri file = Uri.fromFile(new File("path/to/images/file.jpg"));
    UploadTask uploadTask = storageRef.putFile(file);
    uploadTask.addOnProgressListener(new OnProgressListener() {
    @Override
    public void onProgress(UploadTask.TaskSnapshot snapshot) {
        System.out.println(snapshot.getBytesTransferred().toString());
    }
    });
    

    如果对你有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多