简体   繁体   English

适配器notifyDataSetChanged后Android更新imageview

[英]Android update imageview after adapter notifyDataSetChanged

in my adapter and retrieve data from server i can reload recyclerview , in my recyclerview items i have simple imageView and after retrieve data from server and image status, i must be change image in that, but my adapter could not update image after reload data and notifyDataSetChanged . 在我的适配器中并从服务器检索数据,我可以重新加载recyclerview ,在我的recyclerview项中,我具有简单的imageView并且在从服务器和图像状态检索数据之后,我必须更改图像,但是我的适配器在重新加载数据和notifyDataSetChanged

i can retrieve data from server by syncByServer my method after upadte database by this codes: 在此代码更新数据库之后,我可以通过syncByServer我的方法从服务器检索数据:

ContactLists exists_row = realm.where(ContactLists.class).equalTo("mobile_number", mobileNumber).findFirst();
realm.beginTransaction();
if (exists_row != null) {
    exists_row.setIsRegistered("1");
} else {
    exists_row.setIsRegistered("0");
}
realm.commitTransaction();

with setIsRegistered must be change image status, if setIsRegistered is 1, i must be set setImageDrawable from Drawable . 使用setIsRegistered必须更改图像状态,如果setIsRegistered为1,则必须从Drawable设置setImageDrawable

MainActivity: 主要活动:

realm = Realm.getDefaultInstance();
recyclerView = (RecyclerView) findViewById(R.id.rcontactLists);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new ContactsAdapter(results, getApplication());
recyclerView.setAdapter(adapter);
long contact_count = realm.where(ContactLists.class).count();
if (contact_count > 0) {
    reloadFromDatabase();
} else {
    long count = Utils.getLocalContactsList(getContentResolver(), realm);
    if (count > 0) {
        reloadFromDatabase();
    }
    syncByServer();
}

/*----------------------------------------------------------*/

private void reloadFromDatabase() {
    results = realm.where(ContactLists.class).findAll();
    adapter.setData(results);
    adapter.notifyDataSetChanged();
}

private void syncByServer() {
    long count = Utils.getLocalContactsList(getContentResolver(), realm);
    if (count > 0) {
        showProgressDialog();
        results = realm.where(ContactLists.class).findAll();
        ArrayList wordList = new ArrayList<>();
        if (results.size() > 0) {
            for (ContactLists c : results) {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("contactName", c.getContact_name());
                map.put("mobileNumber", c.getMobile_number());
                wordList.add(map);
            }
        }

        String fetch_server_url = SampleApplication.getHostAddress() + "clientSyncContatcLists";

        HttpsTrustManager.allowAllSSL();
        JsonArrayRequest req = new JsonArrayRequest(fetch_server_url, new JSONArray(wordList),
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        for (int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject jsonObject   = response.getJSONObject(i);
                                String     mobileNumber = jsonObject.getString("mobileNumber");

                                ContactLists exists_row = realm.where(ContactLists.class).equalTo("mobile_number", mobileNumber).findFirst();

                                realm.beginTransaction();
                                if (exists_row != null) {
                                    exists_row.setIsRegistered("1");
                                } else {
                                    exists_row.setIsRegistered("0");
                                }
                                realm.commitTransaction();

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        results = realm.where(ContactLists.class).findAll();
                        adapter.setData(results);
                        adapter.notifyDataSetChanged();
                        progressDialog.dismiss();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //Log.e
            }
        });
        EpayApplication.getInstance().addToRequestQueue(req);
    } else {
        Utils.toast(Utils.getString(R.string.there_is_no_contacts), getBaseContext());
    }
}

My adapter 我的适配器

public class ContactsAdapter extends RecyclerView.Adapter<CustomContactsViewHolder> {

    List<ContactLists> list = Collections.emptyList();
    Context context;

    public ContactsAdapter(List<ContactLists> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public CustomContactsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View                     v      = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_item, parent, false);
        CustomContactsViewHolder holder = new CustomContactsViewHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(CustomContactsViewHolder holder, int position) {
        holder.title.setText(list.get(position).getContact_name());
        holder.description.setText(list.get(position).getMobile_number());
        if (list.get(position).getIsRegistered().equals("1"))
            holder.img_logo.setImageDrawable(context.getResources().getDrawable(R.drawable.epay_logo));
        else
            holder.img_logo.setVisibility(View.INVISIBLE);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public void setData(List<ContactLists> list) {
        this.list = list;
    }
}

You are probably running into an NPE. 您可能正在遇到NPE。 The posted code fragment guaranties that exists_row is null in the else branch. 在else分支中, nexted_row的已发布代码片段保证为null

if (exists_row != null) {
   exists_row.setIsRegistered("1");
} else {
   exists_row.setIsRegistered("0");
}

One question remains, why did the IDE not warn you about it? 还有一个问题,为什么IDE不会警告您呢?

OR exists_row is NEVER null . OR exist_row永远不会为null I think thats likely the case here since you didn't write that the app crashes. 我认为这里可能是这样,因为您没有写应用程序崩溃的信息。 Debug that lines to see what exactly is happening. 调试该行以查看发生了什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在adapter.notifyDataSetChanged()之后,Listview不会更新 - Listview does not update after adapter.notifyDataSetChanged() Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新适配器 - Android RecyclerView MVVM where to update Adapter with notifyDataSetChanged Android:adapter.notifydatasetchanged() - Android: adapter.notifydatasetchanged() 微调器显示的值(选择)在适配器更新后更改(notifyDataSetChanged) - Spinner Displayed Value (Selection) Changing After Adapter Update (notifyDataSetChanged) 数据库更新和适配器后,列表视图未更新。notifyDataSetChanged(); - Listview not updating after database update and adapter.notifyDataSetChanged(); 如何在RecyclerView中更新适配器notifydatasetchanged后最后设置滚动位置 - How to set scroll position at last after update adapter notifydatasetchanged in RecyclerView 在通知适配器后,notifyDataSetChanged()不会更新ListView - notifyDataSetChanged() doesn't update ListView after the adapter being notified 如何修复:“notifyDataSetChanged() 未更新 RecyclerView Adapter 中的 ImageView” - How to fix:'notifyDataSetChanged() not updating the ImageView in RecyclerView Adapter' notifyDataSetChanged()无法更新适配器onClick - notifyDataSetChanged() fails to update adapter onClick 无法使用notifyDataSetChanged更新适配器 - Cannot use notifyDataSetChanged to update adapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM