java - 从数据库和异步任务中获取空列表

标签 java android asynchronous arraylist android-sqlite

我有一个联系人表助手,其中有来自数据库的 getAllContacts 方法。 我在异步任务中调用此方法并返回联系人数组列表。

但是当我进行调试时,我发现 getAllContacts 方法中的 conList 返回 0。

 public ArrayList<Contact> getAllContacts() {
    ArrayList<Contact> conList = new ArrayList<Contact>();

    String selectQuery = "SELECT * FROM " + CONTACT_TABLE;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {

            Contact contact = new Contact();

            contact.setContactId(cursor.getString(0));
            contact.setmUserName(cursor.getString(1));
            contact.setmPass(cursor.getString(2));
            contact.setmMobileNo(cursor.getString(3));
            contact.setmEmailId(cursor.getString(4));
            contact.setmProfileImage(cursor.getString(5));
            contact.setmFullName(cursor.getString(6));
            contact.setmJobTitle(cursor.getString(7));
            contact.setmWorkAddress(cursor.getString(8));
            contact.setmWorkPhone(cursor.getString(9));
            contact.setmHomeAddress(cursor.getString(10));
            contact.setmCompany(cursor.getString(11));


            conList.add(contact);
        } while (cursor.moveToNext());
    }

    return conList;
}

异步任务:

    public class GetContacts extends AsyncTask<Void,Void,ArrayList<Contact>> {

        private Context mContext;
        private ContactTableHelper dbConnector;
        private GetContactsFromDbCallback getContactsFromDbCallback;

        public GetContacts(Context context,GetContactsFromDbCallback getContactsFromDbCallback)
        {

            this.mContext = context;
            this.getContactsFromDbCallback = getContactsFromDbCallback;
            dbConnector = new ContactTableHelper(context);

        }
    public interface GetContactsFromDbCallback{
        void doPostExecute(ArrayList<Contact> contacts,boolean b);
    }

        @Override
        public ArrayList<Contact> doInBackground(Void... params) {

            ArrayList<Contact> contacts = new ArrayList<>();

            contacts = dbConnector.getAllContacts();

            return contacts;
        }

        @Override
        public void onPostExecute(ArrayList<Contact> b) {
            if (b != null) {
                // set the adapter's Cursor

                getContactsFromDbCallback.doPostExecute(b,true);

                dbConnector.close();
            }
        }
}

回调:

公共(public)类 MainActivity 扩展 AppCompatActivity 实现 GetContacts.GetContactsFromDbCallback {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    contactList = new ArrayList<Contact>();

}


@Override
public void onResume()
{
    super.onResume();

    contactList.clear();

    if(!firstTimeLogin)
    {
        contactList.clear();

    //    contactDb = new ContactTableHelper(MainActivity.this);
    //    mDb = new UserTableHelper(MainActivity.this);

      // contactList = mDb.getAllContacts();

        new GetUser(MainActivity.this,MainActivity.this).execute(mUserId);

        new GetContacts(MainActivity.this,MainActivity.this).execute();

    }
    else {
        new GetUserAsyncTask(mUserId).execute(mUserId);
        new GetContactsAsyncTask(this, MainActivity.this, mUserId,MainActivity.this).execute();

        firstTimeLogin = false;

        SharedPreferences.Editor editor = getSharedPreferences("UserProfile",MODE_PRIVATE).edit();
        editor.putBoolean("login",firstTimeLogin);
        editor.commit();
    }

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.this);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    adapter = new ContactAdapter(MainActivity.this, contactList);
    recyclerView.setAdapter(adapter);

    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(MainActivity.this, recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            final Contact contact = contactList.get(position);

            // custom dialog

        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

}

@Override
public void doPostExecute(ArrayList<Contact> contactArrayList,boolean y) {

   contactList = contactArrayList;

    adapter.notifyDataSetChanged();
}

这里出了什么问题?请帮助..谢谢..

最佳答案

代替这个

contactList = contactArrayList;

你需要这样做

contactList.clear();
contactList.addAll(contactArrayList);

您正在取消对数组列表的引用,因此适配器不再知道您试图通知它的列表。

关于java - 从数据库和异步任务中获取空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179304/

相关文章:

java - 防止翻转前置摄像头

c# - 多个异步方法,最好使用具有不同返回类型的 WhenAll

android - 处理谷歌地图时如何检测标记和多段线之间的截距

unit-testing - 如何对调用异步方法的同步方法进行单元测试?

javascript - 如何使用 mocha 使用 'done();' 进行异步测试?

java - 使用基于 java 的电子邮件过滤器的 SenderID 验证

java - 在Java中将两个arrayLists合并为一个新的arrayList,没有重复且按顺序排列

java - 使用特殊步骤规则最大化总和的 DP 问题

java - 截断/紧凑 PDF417 矩阵

java - 在 ListView 中添加多个单选按钮时出现错误消息