【问题标题】:How can i open a dialog after clicking a listview item that are generated by AsyncTask?单击由 AsyncTask 生成的列表视图项后,如何打开对话框?
【发布时间】:2016-03-15 12:49:11
【问题描述】:
public class MainActivity extends Activity {

  ListView list;
    LinearLayout ll;
    Button loadBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ll = (LinearLayout) findViewById(R.id.LinearLayout1);

    list = (ListView) findViewById(R.id.listView1);

    loadBtn = (Button) findViewById(R.id.button1);
    loadBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
           LoadContacts lc=new LoadContacts();
           if(lc.execute()!=null)
           {
            Toast toast=Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG);
            toast.show();
           }

        }
    });

}

    class LoadContacts extends AsyncTask<Void, Void, ArrayList<String>>
    {

        ProgressDialog pd;
        @Override
         protected void onPreExecute() {
             // TODO Auto-generated method stub
             super.onPreExecute();

             pd = ProgressDialog.show(MainActivity.this, "Loading Contacts",
                     "Please Wait");
         }
         protected ArrayList<String> doInBackground(Void... params) {
             // TODO Auto-generated method stub
             ArrayList<String> contacts = new ArrayList<String>();

             Cursor c = getContentResolver().query(
                     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                     null, null, null);
             while (c.moveToNext()) {

                 String contactName = c
                         .getString(c
                                 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                 String phNumber = c
                         .getString(c
                                 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                 contacts.add(contactName + ":" + phNumber);

             }
             c.close();

             return contacts;
         }
         @Override
         protected void onPostExecute(ArrayList<String> contacts) {
             // TODO Auto-generated method stub
             super.onPostExecute(contacts);

             pd.cancel();

             ll.removeView(loadBtn);

             ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                     getApplicationContext(), R.layout.text, contacts);

             list.setAdapter(adapter);

             list.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder adb=new AlertDialog.Builder(MainActivity.this);
                    adb.setTitle("call & message");
                    adb.setPositiveButton("call", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            //write here call coding

                        }
                    });

                    adb.setNegativeButton("message", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            //write here message coding
                        }
                    });     
                    }               

            });               
 }
}
}

这是我的MainActivity.java 文件。当我删除对话代码时,它可以正常工作并加载联系人,但对话代码无法正常工作,请任何人帮助我。

【问题讨论】:

    标签: android listview android-asynctask


    【解决方案1】:

    只需使用 setOnItemClickListener 而不是 onClickListener :

                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder adb=new AlertDialog.Builder(MainActivity.this);
                    adb.setTitle("call & message");
                    adb.setPositiveButton("call", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            //write here call coding
    
                        }
                    });
    
                    adb.setNegativeButton("message", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            //write here message coding
                        }
                    });
                }
            });
    

    【讨论】:

      【解决方案2】:

      之后调用您的网络服务

      list = (ListView) findViewById(R.id.listView1);
      

      在onCreate()中调用webservice后编写listview clicklistener。

      因此步骤将是,

      • list = (ListView) findViewById(R.id.listView1)
      • 新的 LoadContacts().execute()
      • list.setOnItemClickListener()

      【讨论】:

      • AsyncTask是异步的,所以可以在执行前设置item点击监听
      • 是的,没错。由于 AsyncTask 是异步的,你也可以先调用它。
      • 如果我在 AsyncTask 之前设置项目单击侦听器,它仍然无法正常工作,因此它如何从我的手机加载联系人,因为 AsyncTask 在 ListView 中加载联系人..不知道它是如何工作的
      【解决方案3】:

      您需要使用list.setOnItemClickListener 来点击列表中的特定项目。

      list.setOnClickListener 将允许您单击列表视图,是的,但它将整个列表视为一个巨大的按钮。

      您可以将整个侦听器代码块从 AsyncTask 移出并移到 onCreate 中,因为 AsyncTask 只需要获取联系人列表并更新列表视图适配器,仅此而已。

      【讨论】:

      • if(lc.execute()!=null) { list.setOnItemClickListener(new OnItemClickListener(){public void onItemClick(AdapterView> arg0, View arg1,int arg2, long arg3) {AlertDialog .Builder adb=newAlertDialog.Builder(MainActivity.this);adb.setTitle("Select");adb.setPositiveButton("call", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) { }} ); adb.setNegativeButton("message", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { }});} });这是我在 onCreate 方法中的对话框代码,它没有给我对话框
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多