Как удалить элемент из recyclerView после его удаления из базы данных

Я использую recyclerView для отображения списка элементов, которые можно удалить, когда пользователь нажимает кнопку удаления каждого элемента. Для этого я использовал адаптер recyclerview.

Что я хочу: из этого адаптера recycleView, когда пользователь нажимает кнопку удаления для элемента, отображается фрагмент диалога, и пользователь должен ввести код, когда этот код действителен, тогда элемент удаляется из обоих база данных и recyclerView

Что я пробовал: после вызова метода show() для dialogFragment в адаптере я вызываю removeItem(getPostion()).

Что я получаю: когда появляется диалоговое окно, элемент удаляется из recyclerView до того, как пользователь введет код, но все еще находится в базе данных. Я пробовал другие вещи, но ни один из них не работал.

Пожалуйста помоги!!! Адаптер RecyclerView (EBAdapter)

public EBViewHolder(View itemView) {
        super(itemView);
            contact_row = (LinearLayout) itemView.findViewById(R.id.contact_row);
            contact_row.setOnClickListener(this);
            contact_photo = (ImageView) itemView.findViewById(R.id.contact_photo);
            contact_photo.setOnClickListener(this);
            contact_fullname = (TextView) itemView.findViewById(R.id.contact_fullname);
            contact_relationship = (TextView) itemView.findViewById(R.id.contact_relationship);
            contact_action = (ImageView) itemView.findViewById(R.id.contact_action);
            contact_action.setOnClickListener(this);
            contact_discard = (ImageView) itemView.findViewById(R.id.discard_action);
            contact_discard.setOnClickListener(this);
        }

    @Override
    public void onClick(View view){
        //Handling recyclerView action clicked
        String status;
        if(view instanceof ImageView) {
            if (view == contact_photo) {
                Log.d("Contact", contact_photo.getId() + "photo " + getPosition() + "clicked");
                ShowContactPhoto dialog = new ShowContactPhoto();
                dialog.setStyle(DialogFragment.STYLE_NO_TITLE,0);
                dialog.show(manager, "ScP_dialog");


            }

            if (view == contact_action) {
                Log.d("Contact", contact_fullname.getText() + "action " + getPosition() + "clicked");
                status = "active";
                Date created_at = new Date();
                Date updated_at = new Date();
                AddInEmergencyBase dialog = new AddInEmergencyBase(((BitmapDrawable)contact_photo.getDrawable()).getBitmap(), contact_fullname.getText().toString(),contact_relationship.getText().toString(),status,created_at.toString(),updated_at.toString());

                dialog.show(manager, "AiB_dialog");
                Log.d("Contact", "Dialog Dismissed now");

            }
//REGION OF INTEREST:
                if (view == contact_discard) {
                    Log.d("Contact", contact_discard.getId() + "photo " + getPosition() + "clicked");
                    status = "inactive";
                    dialog = new  DiscardEmergencyPers(contact_fullname.getText().toString(),status,mModels,getPosition(),rc);

                
                position = getPosition();
                
                dialog.show(manager, "DeP_dialog");
                //dialog.getDialog().setOnDismissListener(this);
                //onDismiss(dialog);
                removeItem(getPosition());
                Log.d("Contact", dialog.getDialog()+"item removed from data actually updated so hihihi....");
                /*ShowContactPhoto dialog = new ShowContactPhoto();
                dialog.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
                dialog.show(manager, "ScP_dialog");*/


            }
        }
        else{
            Log.d("Contact", contact_row.getId() + "row " + getPosition() + "clicked");
        }

Диалогфрагмент (DiscardEmergencyPers)

public class DiscardEmergencyPers extends DialogFragment implements View.OnClickListener, AdapterView.OnItemSelectedListener,DialogInterface.OnDismissListener, DialogInterface {
    private final String fullname;
    private final List<EmBaseInfo> mModels;
    private final String status;
    private final int position;
    private final RecyclerView rc;

//private final String updated_at;
EditText pin_code;
Button cancel, done;
Communicator com;
private EmergenciaDBAdapter emergencia_helper;
private Context context;
private RecyclerView recycler_view;

public DiscardEmergencyPers(String fullname, String status,List<EmBaseInfo> mModels, int position, RecyclerView rc){
    this.fullname=fullname;
    this.status = status;
    this.mModels = mModels;
    this.position = position;
    this.rc =rc;

}
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    com = (Communicator) activity;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dialog_discardemperson, null);
    context = getActivity().getApplicationContext();
    getDialog().setTitle("Remove emergency contact");
    //Spinner that contains relationships with the current contact
    pin_code = (EditText) view.findViewById(R.id.pin);

    /*ArrayAdapter adapter = ArrayAdapter.createFromResource(context, R.array.relationship, android.R.layout.simple_spinner_dropdown_item);
    relationship_spinner.setAdapter(adapter);
    relationship_spinner.setOnItemSelectedListener(this);*/
    //End of Spinner
    //

    emergencia_helper = new EmergenciaDBAdapter(context);
    //spinner = (Spinner)view.findViewById(R.id.spinner);
    cancel = (Button) view.findViewById(R.id.cancel);
    done = (Button) view.findViewById(R.id.done);
    cancel.setOnClickListener(this);
    done.setOnClickListener(this);

    setCancelable(false);
    return view;
}

@Override
public void onClick(View view) {
    if(view.getId()==R.id.cancel){
        dismiss();
        com.onDialogMessage("Cancel clicked");
    }
    else{
        com.onDialogMessage("Done clicked");
        if(pin_code.getEditableText().toString().equals("12345")){
            dismiss();

            emergencia_helper.update(status, fullname/*,updated_at*/);

            //EBAdapter n_adapter = new EBAdapter(getActivity(),removeItem(this.position),getFragmentManager(),rc);
            //rc.setAdapter(n_adapter);
            //rc.getAdapter().(this.position);

            rc.getAdapter().notifyDataSetChanged();
            rc.getAdapter().notifyItemRemoved(0);
            //Bundle savedInstanceState=null;

            //getActivity().onCreate(savedInstanceState);

            CharSequence text = "Good Pin "+rc.getAdapter();
            Log.d("Contacts", rc.getClass()+"");
            Log.d("Contacts", rc.getAdapter()+" "+getActivity());
            int duration = Toast.LENGTH_SHORT;
            Toast.makeText(context, text, duration).show();
        }
        else{
            CharSequence text = "Wrong Pin";
            //Log.d("Contacts", mModels.toString());
            int duration = Toast.LENGTH_SHORT;
            Toast.makeText(context, text, duration).show();
        }



        //long id=emergencia_helper.insert(photo,fullname,phone,relationship, status,created_at,updated_at);
        /*if(id<0){
            CharSequence text = "Row insertion unsuccessful ";
            //Log.d("Contacts", mModels.toString());
            int duration = Toast.LENGTH_SHORT;
            Toast.makeText(context, text, duration).show();
        }
        else{
            CharSequence text = "Row insertion successful ";
            //Log.d("Contacts", mModels.toString());
            int duration = Toast.LENGTH_SHORT;
            Toast.makeText(context, text, duration).show();
        }*/
    }
}    

person doni    schedule 16.07.2015    source источник
comment
опубликуйте свой код, чтобы мы могли помочь с этим   -  person N J    schedule 16.07.2015
comment
я добавил код. пожалуйста, не возражайте против некоторых комментариев в нем.   -  person doni    schedule 16.07.2015
comment
После вызова метода show() для dialogFragment в адаптере я вызываю removeItem(getPostion()) -> почему вы вызвали его здесь? вы должны вызывать его после ввода пользователем правильного кода. Верно?   -  person Lạng Hoàng    schedule 16.07.2015
comment
обычно да, но поскольку пользователь вводит код в диалоговом фрагменте, это означает, что он будет вызываться в этом диалоговом фрагменте, но функция removeItem() недоступна из этого диалогового фрагмента.   -  person doni    schedule 16.07.2015


Ответы (1)


Ваш код довольно сложный!

Но из того, что вы хотите: удалить элемент из базы данных и повторно просмотреть после того, как пользователь введет правильный код. Итак, в основном вы можете достичь этого, выполнив несколько шагов:

  1. Создайте прослушиватель для каждого элемента recyclerview (или кнопки на элементе), когда пользователь нажимает на него -> открывает диалоговое окно.

  2. После того, как пользователь введет правильный код (вы должны проверить правильность кода), сделайте две вещи:

-> Удалить представление из recyclerview через адаптер:

dataSource.remove(index); // remember to remove it from your adapter data source
notifyItemRemoved(index);

-> Удалить данные из базы данных (как удалить зависит от вашего)

Если данные не были удалены из вашей базы данных, отладьте функцию удаления, если она была вызвана, если она работает, или какая-либо ошибка!

Надеюсь, это поможет!

person Lạng Hoàng    schedule 16.07.2015
comment
Пожалуйста, как мне получить источник данных. И реализовано ли удаление () с источником данных или мне нужно создать его самостоятельно? Благодарность - person doni; 16.07.2015
comment
источник данных — это данные, которые вы передали своему адаптеру для отображения в recyclerview. В примере я использую список, поэтому мне не нужно создавать для этого собственную функцию. - person Lạng Hoàng; 16.07.2015
comment
рад это слышать :) - person Lạng Hoàng; 16.07.2015