试图隐藏listview直到列表完全填充android

时间:2014-03-13 09:35:24

标签: java android

我想尝试在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);
            }

        }
    };
}

2 个答案:

答案 0 :(得分:1)

我建议您使用ListFragment

如果您查看文档,则有 setListShown(显示布尔值) setListShownNoAnimation(显示布尔值)。这些方法非常方便,因为已经与ListFragment相关联的布局已经在片段的中心有一个不确定的ProgressBar,并允许您设置一个空文本。

基本上,您可以开始加载(当用户正在观看屏幕上的进度时),一旦完成,您可以调用上述两种方法之一并显示结果。

编辑: 使用该片段的另一个原因是,如果您想支持平板电脑并遵循Android设计规则,通过它们变得更加容易,使您的组件更易于重复使用。

如果您需要支持旧版本的平台,请使用支持库提供的ListFragment。

答案 1 :(得分:0)

使用Async任务填充数据,并在onPostExecute方法中显示listview。在加载列表时,您可以使用空视图来显示加载动画或文本。可能是你想要的任何东西,取决于你试图建立的应用程序。如果列表实际上是空的,甚至可能是一个巨大的操作按钮。(就像Google Keep应用程序一样)

编辑:

将数据填充到&#34;用户&#34; Arraylist并在onPostExecute中调用以下内容

  adapter.notifyDatasetChanged();

那应该刷新列表视图。