我想尝试在android中填充listview,但我不希望列表显示直到列表完成。我已经找到了一种方法,但它的编码非常糟糕,并希望改变它。
这是我的代码:
public class Admin extends ListActivity
{
static java.sql.Connection con;
static java.sql.Statement stmt = null;
static java.sql.ResultSet rs = null;
String user = null;
//public final static String Username = "com.example.securelogin.Username";
Button EditButton;
// Progress Dialog
private ProgressDialog pDialog;
final Vector<String> users = new Vector<String>();
boolean ready = false;
int counter = 0;
@SuppressWarnings("unchecked")
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin);
EditButton = (Button) findViewById(R.id.button2);
EditButton.setOnClickListener(onUpdate);
counter++;
for(int i = 0; i < 1; i++)
{
new Listview().execute();
while(!ready)
{
}
}
setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, users));
}
public void onListItemClick(ListView parent, View v,int position, long id)
{
super.onListItemClick(parent, v, position, id);
user = users.get(position);
Toast.makeText(this, "You have selected " + users.get(position), Toast.LENGTH_SHORT).show();
}
class Listview extends AsyncTask<Vector<String>, String, Vector<String>>
{
boolean failure = false;
@Override
protected void onPreExecute()
{
super.onPreExecute();
pDialog = new ProgressDialog(Admin.this);
pDialog.setMessage("Gathering Data");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected Vector<String> doInBackground(Vector<String>... params)
{
try
{
rs = Database.ListUsers();
System.out.println("Executed statement");
while(rs.next())
{
String Description = rs.getString(1);
users.add(Description);
System.out.println("In the while loop");
}
System.out.println("you got past the statement");
ready = true;
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return users;
}
protected void onPostExecute(Vector<String> names)
{
// dismiss the dialog once product deleted
pDialog.dismiss();
}
}
private View.OnClickListener onUpdate= new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(user == null)
{
return;
}
else
{
Intent i = new Intent(Admin.this, EditUser.class);
i.putExtra("Username",user );
System.out.println(user);
finish();
startActivity(i);
}
}
};
}
答案 0 :(得分:1)
我建议您使用ListFragment。
如果您查看文档,则有 setListShown(显示布尔值)和 setListShownNoAnimation(显示布尔值)。这些方法非常方便,因为已经与ListFragment相关联的布局已经在片段的中心有一个不确定的ProgressBar,并允许您设置一个空文本。
基本上,您可以开始加载(当用户正在观看屏幕上的进度时),一旦完成,您可以调用上述两种方法之一并显示结果。
编辑: 使用该片段的另一个原因是,如果您想支持平板电脑并遵循Android设计规则,通过它们变得更加容易,使您的组件更易于重复使用。
如果您需要支持旧版本的平台,请使用支持库提供的ListFragment。
答案 1 :(得分:0)
使用Async任务填充数据,并在onPostExecute方法中显示listview。在加载列表时,您可以使用空视图来显示加载动画或文本。可能是你想要的任何东西,取决于你试图建立的应用程序。如果列表实际上是空的,甚至可能是一个巨大的操作按钮。(就像Google Keep应用程序一样)
编辑:
将数据填充到&#34;用户&#34; Arraylist并在onPostExecute中调用以下内容
adapter.notifyDatasetChanged();
那应该刷新列表视图。