从适配器重新加载碎片/活动(或回收视图)



我有一个简单的应用程序,其中包含片段和活动,托管一个回收器视图,vith数据来自数据库,我有删除功能,但我无法刷新回收器视图。我尝试了一些方法,但因为我的长按卡视图在适配器上,我无法使其在上工作

这是我的适配器:

public class LoyaltyCardRVAdapter extends RecyclerView.Adapter<LoyaltyCardRVAdapter.CardViewHolder> {
...
public LoyaltyCardRVAdapter(Context context, ArrayList<LoyaltyCardObject> cards) {
    this.context = context;
    this.cards = cards;
}
public void setData(ArrayList<LoyaltyCardObject> cards) {
    this.cards = cards;
}
@Override
public int getItemCount() {
    return cards.size();
}
@Override
public void onBindViewHolder(CardViewHolder holder, int position) {
    LoyaltyCardObject card = cards.get(position);
    holder.marque.setText(card.getMarque());
    ...
}
@Override
public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.loyaltycard_row,
            parent, false);
    return new CardViewHolder(view, context, cards);
}

/**
 * Cette classe initialise chaque cardview avec l'object correspondant
 */
public static class CardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
    CardView cardView;
    TextView mail, marque, code;
    ArrayList<LoyaltyCardObject> cards = new ArrayList<>();
    Context context;
    AlertDialog.Builder alertDialogBuilder;
    RequestQueue requestQueue;
    ImageView logo;
    public CardViewHolder(View view, Context context, ArrayList<LoyaltyCardObject> cards) {
        ...
    }
    @Override
    public void onClick(View v) { //Gère le clique sur une cardview
        int position = getAdapterPosition();
        LoyaltyCardObject card = this.cards.get(position);
        Toast.makeText(context, "Codebarre pour la carte " + card.getMarque(), Toast.LENGTH_SHORT).show();
        Intent intentcode = new Intent(this.context.getApplicationContext(), LoyaltyCardShowCodeActivity.class);
        intentcode.putExtra("code", card.getCode());
        this.context.startActivity(intentcode);
    }
    @Override
    public boolean onLongClick(View v) {
        int position = getAdapterPosition();
        final LoyaltyCardObject card = this.cards.get(position);
        requestQueue = Volley.newRequestQueue(context);

        alertDialogBuilder
                .setTitle("Effacer")
                .setMessage("Voulez-vous vraiment effacer cette carte ?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        StringRequest request = new StringRequest(Request.Method.POST, url,
                                new Response.Listener<String>() {
                                    @Override
                                    public void onResponse(String response) {
                                        Toast.makeText(context, "Carte n°" + card.getCode() + " chez " + card.getMarque() + " effacé", Toast.LENGTH_SHORT).show();
                                    }
                                }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.i("MYAPP", "onErrorResponse()");
                            }
                        }) { // Paramètres de la requete
                            @Override
                            protected Map<String, String> getParams() throws AuthFailureError {
                                Map<String, String> parameters = new HashMap<String, String>();
                                parameters.put("mail", card.getMail());
                                parameters.put("code", card.getCode());
                                return parameters;
                            }
                        };
                        requestQueue.add(request);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                })
                .setIcon(R.drawable.ic_error_outline_black_24dp)
                .show();
        return false;
    }
}

}

我在这个例子中的片段:

public class LoyaltyCardListFragment extends android.support.v4.app.Fragment {
LoyaltyCardRVAdapter adapter;
ProgressDialog dialog;
TextView addCards;
UserSharedPreferences userSharedPreferences;
ArrayList<LoyaltyCardObject> cards = new ArrayList<LoyaltyCardObject>();
String url = ServerURL.CARD_GET;
AlertDialog.Builder builder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.loyaltycard_list_fragment, container, false);
    RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.rv_cards);
    recyclerView.setHasFixedSize(true);
    adapter = new LoyaltyCardRVAdapter(getActivity(), cards);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(llm);
    recyclerView.setAdapter(adapter);
    addCards = (TextView) rootView.findViewById(R.id.addCards);
    adapter.setData(cards);
    dialog = new ProgressDialog(getActivity());
    dialog.setMessage("Chargement");
    dialog.setCancelable(true);
    showDialog();
    addCards.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Ajout de carte");
            builder.setMessage("Comment ajouter ?");
            builder.setPositiveButton("Scanner", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    Log.i("Alert", "YES");
                    Intent intent = new Intent(getActivity(), LoyaltyCardAddWithScannerActivity.class);
                    startActivity(intent);
                }
            });
            builder.setNegativeButton("Manuel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    Log.i("Alert", "NO");
                    startActivity(new Intent(getActivity(), LoyaltyCardAddActivity.class));
                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    });
    getAndInitData();
    return rootView;
}
public void getAndInitData() { //Recupère les cartes de l'utilisateur et les affiches dans un recycler view sous forme de cardview
    userSharedPreferences = new UserSharedPreferences(getActivity());
    final UserObject user = userSharedPreferences.getLoggedInUser();
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url + user.mail,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        for (int i = 0; i < response.length(); i++) {
                            JSONObject object = response.getJSONObject(i);
                            LoyaltyCardObject card = new LoyaltyCardObject();
                            card.setMail(object.getString("mail"));
                            card.setMarque(object.getString("marque"));
                            card.setCode(object.getString("code"));
                            cards.add(card);
                        }
                        hideDialog();
                        adapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            View view = getView();
            LinearLayout ll = (LinearLayout) view.findViewById(R.id.cardlist);
            Log.d("ERROR!!!", error.toString());
            hideDialog();
            Snackbar snackbar = Snackbar  //Si l'utilisateur n'a pas de carte de fidelite, affiche un snackbar qui propose d'ajouter une carte
                    .make(ll, "Aucune carte", Snackbar.LENGTH_LONG)
                    .setAction("Ajouter", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            builder = new AlertDialog.Builder(getActivity());
                            builder.setTitle("Ajout de carte");
                            builder.setMessage("Comment ajouter ?");
                            builder.setPositiveButton("Scanner", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                    Log.i("Alert", "YES");
                                    Intent intent = new Intent(getActivity(), LoyaltyCardAddWithScannerActivity.class);
                                    startActivity(intent);
                                }
                            });
                            builder.setNegativeButton("Manuel", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                    Log.i("Alert", "NO");
                                    startActivity(new Intent(getActivity(), LoyaltyCardAddActivity.class));
                                }
                            });
                            AlertDialog alertDialog = builder.create();
                            alertDialog.show();
                        }
                    });
            snackbar.show();
        }
    });
    AppController.getInstance().getRequestQueue().add(jsonArrayRequest);
}
public void showDialog() {
    if (!dialog.isShowing())
        dialog.show();
}
public void hideDialog() {
    if (dialog.isShowing())
        dialog.hide();
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    dialog.hide();
    dialog.dismiss();
}

}

当包含适配器的数据发生更改时,可以调用一个方法。例如:

  1. 创建您的ListView、RecyclerView
  2. 创建适配器
  3. 将适配器设置为ListView
  4. 做这项工作(更改数据、删除数据,等等…)

现在,如果您想刷新链接到适配器的视图中的实际信息,请调用方法:

adapter.notifyDataSetChanged();

这将使用正确和最新的信息更新您的视图信息。

希望它能有所帮助

从RecyclerView 中删除项目有4个步骤

list.remove(position);
recycler.removeViewAt(position);
mAdapter.notifyItemRemoved(position);                 
mAdapter.notifyItemRangeChanged(position, list.size());

您必须在活动/片段代码中执行此操作。

最新更新