当正常 运行 程序时,我没有得到联系人姓名。但是当我在所有语句中插入调试点时,就会自动添加联系人
I am not gettting contacts name when Normally run program. But when i insert debug point at all statement then automatically the contacts are added
看看这个代码片段。在这里,我使用 AsyncTask 在后台获取联系方式。当我只是 运行 时,我没有得到任何东西,但是当我搜索某个联系人时,它会显示所有联系人。但是在搜索任何联系人之前,我无法获取联系人列表。请帮助我在搜索之前获取所有联系人。
提前致谢
public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
public List<MyModel> modelData = new ArrayList<>();
RecyclerView mRecyclerView;
ProgressDialog dialog;
SimpleCursorAdapter mAdapter;
MyAdapter adapter;
MatrixCursor mMatrixCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
dialog = new ProgressDialog(this);
mMatrixCursor = new MatrixCursor(new String[]{"_id", "name", "details"});
mAdapter = new SimpleCursorAdapter(getBaseContext(),
R.layout.contacts_row,
null,
new String[]{"name", "details"},
new int[]{R.id.tv_name, R.id.phone_number}, 0);
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
for (MyModel model : modelData) {
Log.e("model 2", model.getName());
}
if (modelData.size() == 0) {
Log.e("Size", "Empty");
}
adapter = new MyAdapter(MainActivity.this, modelData);
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
final List<MyModel> filteredModelList = filter(modelData, newText);
adapter.animateTo(filteredModelList);
mRecyclerView.scrollToPosition(0);
return true;
}
private List<MyModel> filter(List<MyModel> models, String query) {
query = query.toLowerCase();
final List<MyModel> filteredModelList = new ArrayList<>();
for (MyModel model : models) {
final String text = model.getName().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
/*if (id == R.id.action_settings) {
return true;
}*/
return super.onOptionsItemSelected(item);
}
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
/* @Override
protected Void doInBackground(Void... params) {
return null;
}*/
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
dialog.dismiss();
}
@Override
protected Void doInBackground(Void... params) {
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
// Querying the table ContactsContract.Contacts to retrieve all the contacts
Cursor contactsCursor = getContentResolver().query(contactsUri, null, null, null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
if (contactsCursor.moveToFirst()) {
do {
long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID"));
Log.e("Contact Id ", "" + contactId);
Uri dataUri = ContactsContract.Data.CONTENT_URI;
Log.e("Contact URI ", "" + dataUri);
// Querying the table ContactsContract.Data to retrieve individual items like
// home phone, mobile phone, work email etc corresponding to each contact
Cursor dataCursor = getContentResolver().query(dataUri, null,
ContactsContract.Data.CONTACT_ID + "=" + contactId,
null, null);
String displayName = "";
String homePhone = "";
String mobilePhone = "";
String workPhone = "";
if (dataCursor.moveToFirst()) {
// Getting Display Name
displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
//modelData.add(new MyModel(displayName));
Log.e("DisplayName ", displayName);
do {
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
switch (dataCursor.getInt(dataCursor.getColumnIndex("data2"))) {
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
}
}
} while (dataCursor.moveToNext());
String details = "";
// Concatenating various information to single string
if (homePhone != null && !homePhone.equals(""))
details = "HomePhone : " + homePhone + "\n";
if (mobilePhone != null && !mobilePhone.equals(""))
details += "MobilePhone : " + mobilePhone + "\n";
if (workPhone != null && !workPhone.equals(""))
details += "WorkPhone : " + workPhone + "\n";
Log.e("Details ", details);
mMatrixCursor.addRow(new Object[]{Long.toString(contactId), displayName, details});
modelData.add(new MyModel(displayName, details));
}
} while (contactsCursor.moveToNext());
}
contactsCursor.close();
for (MyModel model : modelData) {
Log.e("model for loop ", model.getName() + " " + model.getPhoneNumber());
}
return null;
}
}
}
这是因为当您在 AsyncTask 之前设置适配器时,它在单独的线程中执行。因为你的任务还没有完成
将您的代码移至 AsyncTask
的 onPostExecute
中的 setAdapter
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
adapter = new MyAdapter(MainActivity.this, modelData);
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
dialog.dismiss();
}
看看这个代码片段。在这里,我使用 AsyncTask 在后台获取联系方式。当我只是 运行 时,我没有得到任何东西,但是当我搜索某个联系人时,它会显示所有联系人。但是在搜索任何联系人之前,我无法获取联系人列表。请帮助我在搜索之前获取所有联系人。
提前致谢
public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
public List<MyModel> modelData = new ArrayList<>();
RecyclerView mRecyclerView;
ProgressDialog dialog;
SimpleCursorAdapter mAdapter;
MyAdapter adapter;
MatrixCursor mMatrixCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
dialog = new ProgressDialog(this);
mMatrixCursor = new MatrixCursor(new String[]{"_id", "name", "details"});
mAdapter = new SimpleCursorAdapter(getBaseContext(),
R.layout.contacts_row,
null,
new String[]{"name", "details"},
new int[]{R.id.tv_name, R.id.phone_number}, 0);
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
for (MyModel model : modelData) {
Log.e("model 2", model.getName());
}
if (modelData.size() == 0) {
Log.e("Size", "Empty");
}
adapter = new MyAdapter(MainActivity.this, modelData);
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
final List<MyModel> filteredModelList = filter(modelData, newText);
adapter.animateTo(filteredModelList);
mRecyclerView.scrollToPosition(0);
return true;
}
private List<MyModel> filter(List<MyModel> models, String query) {
query = query.toLowerCase();
final List<MyModel> filteredModelList = new ArrayList<>();
for (MyModel model : models) {
final String text = model.getName().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
/*if (id == R.id.action_settings) {
return true;
}*/
return super.onOptionsItemSelected(item);
}
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
/* @Override
protected Void doInBackground(Void... params) {
return null;
}*/
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
dialog.dismiss();
}
@Override
protected Void doInBackground(Void... params) {
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
// Querying the table ContactsContract.Contacts to retrieve all the contacts
Cursor contactsCursor = getContentResolver().query(contactsUri, null, null, null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
if (contactsCursor.moveToFirst()) {
do {
long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID"));
Log.e("Contact Id ", "" + contactId);
Uri dataUri = ContactsContract.Data.CONTENT_URI;
Log.e("Contact URI ", "" + dataUri);
// Querying the table ContactsContract.Data to retrieve individual items like
// home phone, mobile phone, work email etc corresponding to each contact
Cursor dataCursor = getContentResolver().query(dataUri, null,
ContactsContract.Data.CONTACT_ID + "=" + contactId,
null, null);
String displayName = "";
String homePhone = "";
String mobilePhone = "";
String workPhone = "";
if (dataCursor.moveToFirst()) {
// Getting Display Name
displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
//modelData.add(new MyModel(displayName));
Log.e("DisplayName ", displayName);
do {
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
switch (dataCursor.getInt(dataCursor.getColumnIndex("data2"))) {
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
}
}
} while (dataCursor.moveToNext());
String details = "";
// Concatenating various information to single string
if (homePhone != null && !homePhone.equals(""))
details = "HomePhone : " + homePhone + "\n";
if (mobilePhone != null && !mobilePhone.equals(""))
details += "MobilePhone : " + mobilePhone + "\n";
if (workPhone != null && !workPhone.equals(""))
details += "WorkPhone : " + workPhone + "\n";
Log.e("Details ", details);
mMatrixCursor.addRow(new Object[]{Long.toString(contactId), displayName, details});
modelData.add(new MyModel(displayName, details));
}
} while (contactsCursor.moveToNext());
}
contactsCursor.close();
for (MyModel model : modelData) {
Log.e("model for loop ", model.getName() + " " + model.getPhoneNumber());
}
return null;
}
}
}
这是因为当您在 AsyncTask 之前设置适配器时,它在单独的线程中执行。因为你的任务还没有完成
将您的代码移至 AsyncTask
的onPostExecute
中的 setAdapter
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
adapter = new MyAdapter(MainActivity.this, modelData);
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
dialog.dismiss();
}