好的,现在我有一个ListView
,通过PHP script.
填充信息。现在,列表一次加载一个。通过这个,我的意思是用户可以看到每个列表被加载的时间(例如,他们看到一个项目,一秒钟后他们看到第二个项目,等等)。我想要做的是等待直到检索到所有项目然后显示他们一下子。虽然这种情况正在发生,但要有某种类型的" loading"指标(可能是一个旋转圈型交易)。有什么方法可以实现吗?这是我的代码:
public class MainActivity extends ActionBarActivity {
ArrayList<Location> arrayOfLocations;
LocationAdapter adapter;
Button refresh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// Construct the data source
arrayOfLocations = new ArrayList<Location>();
// Create the adapter to convert the array to views
adapter = new LocationAdapter(this, arrayOfLocations);
getData();
// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(adapter);
}
}
因此,我的getData()方法将每个Location添加到适配器中 然后我的Adapter类将数据放入ListView:
public class LocationAdapter extends ArrayAdapter<Location> {
public LocationAdapter(Context context, ArrayList<Location> locations) {
super(context, R.layout.item_location, locations);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
Location location = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.item_location, parent, false);
}
// Lookup view for data population
TextView tvName = (TextView) convertView.findViewById(R.id.tvName);
TextView tvDetails = (TextView) convertView
.findViewById(R.id.tvDetails);
TextView tvDistance = (TextView) convertView
.findViewById(R.id.tvDistance);
TextView tvHours = (TextView) convertView.findViewById(R.id.tvHours);
ImageView ivIcon = (ImageView) convertView.findViewById(R.id.imgIcon);
// Populate the data into the template view using the data object
tvName.setText(location.name);
tvDetails.setText(location.details);
tvDistance.setText(location.distance);
tvHours.setText(location.hours);
ivIcon.setImageBitmap(location.icon);
// Return the completed view to render on screen
return convertView;
}
}
另外,我有一个简单加载指示器的代码:
public class MainActivity extends Activity {
private ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = new ProgressDialog(this);
}
public void open(View view) {
progress.setMessage("Loading...Please Wait");
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.setIndeterminate(true);
progress.show();
final int totalProgressTime = 100;
final Thread t = new Thread() {
@Override
public void run() {
int jumpTime = 0;
while (jumpTime < totalProgressTime) {
try {
sleep(200);
jumpTime += 5;
progress.setProgress(jumpTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
所以基本上,我想要做的是弄清楚如何做到这一点: 1.当活动开始时,显示&#34; loading&#34;指示符 2.将所有项目加载到ListView中 3.列出所有项目后,删除&#34; loading&#34;指示器并显示ListView
有什么想法吗?感谢。
答案 0 :(得分:1)
另一种实现此目的的简单方法是让视图中的ProgressBar可见,并在处理完成后隐藏它:
<RelativeLayout
android:id="@+id/app_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<FrameLayout
android:id="@+id/loading_progress_container"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerInParent="true">
<ProgressBar
android:id="@+id/list_progress_indicator"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
<com.example.MyListView
android:id="@+id/my_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</RelativeLayout>
然后在回复您的请求时,该工作会执行以下操作:
final View progressView = containerView.findViewById(R.id.loading_progress_container);
final View myListView = containerView.findViewById(R.id.my_list_view);
activity.runOnUiThread(new Runnable() {
progressView.setVisibility(View.GONE);
myListView.setVisibility(View.VISIBLE);
});
显然,您需要引用上述代码的容器视图和活动。
答案 1 :(得分:0)
要做到这一点,你需要一个扩展AsyncTask的类。在doInBackground方法的这个类中,你需要做所有&#34; heavy&#34;东西。在您的情况下填充ListView。如果要显示进度,可以在每次迭代结束时调用publishProgress方法。最后在onPostExecute方法中,您可以通知用户该过程已完成。这是一个简单的例子
public class ExampleAsync extends AsyncTask <Void, Integer, Void> {
private ProgressDialog progressBar; //to show a little modal with a progress Bar
private Context context; //needed to create the progress bar
public ExampleAsync(Context context){
this.context = context;
}
//this is called BEFORE you start doing anything
@Override
protected void onPreExecute(){
progressBar = new ProgressDialog(context);
progressBar.setCancelable(false);
progressBar.setMessage("I am starting to look for stuff");
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setIndeterminate(true);
progressBar.show();
}
//every time you call publishProgress this method is executed, in this case receives an Integer
@Override
protected void onProgressUpdate(Integer ... option){
progressBar.setMessage("I have found :" + option[0]);
}
@Override
protected void onPostExecute(Void unused){
progressBar.dismiss(); //hides the progress bar
//do whatever you want now
}
//in here is where you execute your php script or whatever "heavy" stuff you need
@Override
protected Void doInBackground(Void... unused) {
for (int i = 0; i < someLimit; i++){
//do something
publishProgress(i); //to show the progress
}
}
}
在您的主要活动中:
//code
new ExampleAsync(this).execute();
显然这是一个简单的例子。您可以在onProgressUpdate方法中执行大量操作,并且需要更新进度条的方法。
希望有所帮助