Firebase Adapter.notifydatasetchanged在RecyclerView中不工作

Firebase Adapter.notifydatasetchanged在RecyclerView中不工作,firebase,firebase-realtime-database,android-recyclerview,Firebase,Firebase Realtime Database,Android Recyclerview,好的,伙计们,我在刷新我的适配器时遇到问题,在我更新回收视图中的项目后,它在firebase中更改,但在我的回收视图中没有更改,我必须再次打开活动,然后它只显示最新信息 我已经放置了adapter.notifydatasetchanged(),但我认为它不起作用,但在我添加新项目或删除时,它会立即刷新我的回收视图 private ProgressBar progressBar; private FirebaseStorage firebaseStorage; private Database

好的,伙计们,我在刷新我的适配器时遇到问题,在我更新回收视图中的项目后,它在firebase中更改,但在我的回收视图中没有更改,我必须再次打开活动,然后它只显示最新信息

我已经放置了adapter.notifydatasetchanged(),但我认为它不起作用,但在我添加新项目或删除时,它会立即刷新我的回收视图

private ProgressBar progressBar;

private FirebaseStorage firebaseStorage;

private DatabaseReference databaseReference;
private StorageReference storageReference;
private List<FoodInfo> mfoodinfo;

private ImageView imageView;

private EditText foodname,foodprice,fooddesc,Storename;
SearchView searchView;
ArrayList<FoodInfo> newlist;

private final static int  PICK_IMAGE_REQUEST =1;
private Uri imageUri;
private StorageTask mUploadTask;

FoodInfo foodInfo;

ProgressDialog pd;
AlertDialog alertDialog;

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

    setTitle("Menu");

    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    progressBar = findViewById(R.id.progress_circle);

    mfoodinfo = new ArrayList<>();

    foodAdapter = new FoodAdapter(Recycleview.this, mfoodinfo);
    recyclerView.setAdapter(foodAdapter);

    Intent intent = getIntent();
    String StoreName = intent.getStringExtra("Storename");

    foodAdapter.setOnItemClickListener(Recycleview.this);
    firebaseStorage = FirebaseStorage.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference("FoodInfo");

    pd = new ProgressDialog(this);
    pd.setMessage("Updating in Progress");
    pd.setCanceledOnTouchOutside(false);


    Query query = databaseReference.orderByChild("storename").equalTo(StoreName);
    query.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s)
        {

            mfoodinfo.add(dataSnapshot.getValue(FoodInfo.class));
            foodAdapter.setFood(dataSnapshot.getValue(FoodInfo.class));
            foodAdapter.notifyDataSetChanged();

            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}


@Override
public void UpdateFood(int position)
{
    showUpdateDialog(position);
}

private void showUpdateDialog(int pos) {

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.update_dialog, null);
    dialogBuilder.setView(dialogView);

    imageView = (ImageView) dialogView.findViewById(R.id.imageView);
    Picasso.with(this).load(mfoodinfo.get(pos).imageUrl).placeholder(R.mipmap.image).resize(150,150).into(imageView);

    foodname = (EditText) dialogView.findViewById(R.id.updfood);
    foodname.setText(mfoodinfo.get(pos).foodname);

    foodprice = (EditText) dialogView.findViewById(R.id.updprice);
    foodprice.setText(mfoodinfo.get(pos).foodprice);

    fooddesc = (EditText) dialogView.findViewById(R.id.upddesc);
    fooddesc.setText(mfoodinfo.get(pos).fooddesc);

    Storename = (EditText) dialogView.findViewById(R.id.storename);
    Storename.setText(mfoodinfo.get(pos).storename);

    final Button update = (Button) dialogView.findViewById(R.id.btnUpdate);
    final Button cancel = (Button) dialogView.findViewById(R.id.btnCancel);

    dialogBuilder.setTitle("Update");
    alertDialog = dialogBuilder.create();
    alertDialog.show();

    update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            UpdateFood(v);
            foodAdapter.notifyDataSetChanged();

        }
    });

    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectImage();

        }
    });


    cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alertDialog.dismiss();
        }
    });

}

public void selectImage(){
    Intent photoPickerIntent = new Intent();
    photoPickerIntent.setType("image/*");
    photoPickerIntent.setAction(Intent.ACTION_PICK);
    startActivityForResult(photoPickerIntent, PICK_IMAGE_REQUEST);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null){

        imageUri = data.getData();
        Picasso.with(this).load(imageUri).into(imageView);

    }
}

private String getFileExtension(Uri uri) {
    ContentResolver cR = getContentResolver();
    MimeTypeMap mime = MimeTypeMap.getSingleton();
    return mime.getExtensionFromMimeType(cR.getType(uri));
}

public void UpdateFood(View v) {
    final String name = foodname.getText().toString();
    foodprice.getText().toString();
    fooddesc.getText().toString();
    Storename.getText().toString();


    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    Dialog dialog;
    builder.setMessage("Do you want to update this food info?");
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(final DialogInterface dialog, int which)
        {

            pd.show();
            final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("FoodInfo").child(name);


            final Map m = new HashMap();
            m.put("foodprice", foodprice.getText().toString().trim());
            m.put("fooddesc",  fooddesc.getText().toString().trim());

            StorageReference sr =  FirebaseStorage.getInstance().getReference();

            StorageReference reference  = sr.child(System.currentTimeMillis()
                    + "." + getFileExtension(imageUri));

            reference.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
                {
                    m.put("imageUrl", taskSnapshot.getDownloadUrl().toString());
                    databaseReference.updateChildren(m).addOnCompleteListener(new OnCompleteListener<Void>()
                    {
                        @Override
                        public void onComplete(@NonNull Task<Void> task)
                        {
                            pd.dismiss();
                            if(task.isSuccessful())
                            {
                                alertDialog.dismiss();
                                Toast.makeText(Recycleview.this, "Food Updated Successfully", Toast.LENGTH_LONG).show();
                                foodAdapter.notifyDataSetChanged();
                            }

                            else
                            {
                                Toast.makeText(Recycleview.this, "Failed to Update" + task.getException(), Toast.LENGTH_LONG).show();
                                alertDialog.dismiss();
                            }
                        }
                    });
                }
            }).addOnFailureListener(new OnFailureListener()
            {
                @Override
                public void onFailure(@NonNull Exception e)
                {
                    alertDialog.dismiss();
                    Toast.makeText(Recycleview.this, "Failed to upload Image" + e.toString(), Toast.LENGTH_SHORT).show();
                    Log.i("Error Image " , e.toString());
                }
            });



        }
    });
    builder.setNegativeButton("No", null);
    dialog = builder.create();
    dialog.show();

}


@Override
public void onItemClick(int position) {
    Toast.makeText(this, "Normal click at position: " + position, Toast.LENGTH_SHORT).show();
}




@Override
public void onDeleteClick(final int position)
{
    FoodInfo selectedItem;

    if(!searchView.getQuery().toString().isEmpty())
    {
        selectedItem = newlist.get(position);
    }
    else
    {
        selectedItem = mfoodinfo.get(position);
    }

    final String selectedKey = selectedItem.getFoodname();

    StorageReference imageRef = firebaseStorage.getReferenceFromUrl(selectedItem.getImageUrl());
    imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            databaseReference.child(selectedKey).removeValue();
            Toast.makeText(Recycleview.this, "Item deleted", Toast.LENGTH_SHORT).show();
            mfoodinfo.remove(position);
            foodAdapter.notifyDataSetChanged();

        }
    });

}




@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu,menu);
    MenuItem menuItem = menu.findItem(R.id.search);

    searchView = (SearchView) menuItem.getActionView();
    searchView.setOnQueryTextListener(this);

    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {

    newText = newText.toLowerCase();
    newlist = new ArrayList<>();
    for (FoodInfo foodInfo : mfoodinfo){

        String name = foodInfo.getFoodname().toLowerCase();
        if (name.contains(newText))
            newlist.add(foodInfo);
    }

    foodAdapter.setFilter(newlist);


    return true;
}
private ProgressBar ProgressBar;
私有FirebaseStorage FirebaseStorage;
私有数据库参考数据库参考;
私有存储参考存储参考;
私有列表mfoodinfo;
私人影像视图;
私有EditText foodname、foodprice、FoodDisc、Storename;
搜索视图搜索视图;
ArrayList新列表;
私有最终静态整数选取图像请求=1;
私有Uri-imageUri;
专用存储任务mUploadTask;
FoodInfo FoodInfo;
进展性帕金森病;
警报对话框警报对话框;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u recycleview);
设置标题(“菜单”);
recyclerView=findViewById(R.id.recycler\u视图);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
progressBar=findViewById(R.id.progress\u圆圈);
mfoodinfo=newarraylist();
foodAdapter=新的foodAdapter(Recycleview.this,mfoodinfo);
recyclerView.setAdapter(foodAdapter);
Intent=getIntent();
String StoreName=intent.getStringExtra(“StoreName”);
setOnItemClickListener(Recycleview.this);
firebaseStorage=firebaseStorage.getInstance();
databaseReference=FirebaseDatabase.getInstance().getReference(“FoodInfo”);
pd=新进度对话框(本);
pd.setMessage(“正在更新”);
pd.SetCanceledOnTouchOut(假);
Query Query=databaseReference.orderByChild(“storename”).equalTo(storename);
addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s)
{
add(dataSnapshot.getValue(FoodInfo.class));
setFood(dataSnapshot.getValue(FoodInfo.class));
foodAdapter.notifyDataSetChanged();
progressBar.setVisibility(View.GONE);
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
@凌驾
公共void UpdateFood(内部位置)
{
showUpdateDialog(位置);
}
私有void showUpdateDialog(int pos){
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(此);
LayoutInflater充气机=getLayoutInflater();
最终视图对话框视图=充气机。充气(R.layout.update_对话框,空);
dialogBuilder.setView(dialogView);
imageView=(imageView)dialogView.findViewById(R.id.imageView);
Picasso.with(this).load(mfoodinfo.get(pos.imageUrl).placeholder(R.mipmap.image).resize(150150).into(imageView);
foodname=(EditText)dialogView.findViewById(R.id.updfood);
foodname.setText(mfoodinfo.get(pos.foodname));
foodprice=(EditText)dialogView.findViewById(R.id.updprice);
foodprice.setText(mfoodinfo.get(pos.foodprice));
fooddesc=(EditText)dialogView.findViewById(R.id.upddesc);
fooddesc.setText(mfoodinfo.get(pos.fooddesc));
Storename=(EditText)dialogView.findViewById(R.id.Storename);
Storename.setText(mfoodinfo.get(pos.Storename));
最终按钮更新=(按钮)dialogView.findViewById(R.id.btnUpdate);
最终按钮取消=(按钮)dialogView.findViewById(R.id.btnCancel);
dialogBuilder.setTitle(“更新”);
alertDialog=dialogBuilder.create();
alertDialog.show();
update.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v)
{
更新日期(五);
foodAdapter.notifyDataSetChanged();
}
});
imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
选择image();
}
});
cancel.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
alertDialog.disclose();
}
});
}
public void selectImage(){
Intent photoPickerIntent=新Intent();
photopickerinent.setType(“image/*”);
photoPickerIntent.setAction(意图、动作和拾取);
startActivityForResult(光采集器内容、图像采集器请求);
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据)
{
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==PICK\u IMAGE\u REQUEST&&resultCode==RESULT\u OK&&data!=null&&data.getData()!=null){
imageUri=data.getData();
毕加索.with(this).load(imageUri).into(imageView);
}
}
私有字符串getFileExtension(Uri){
ContentResolver cR=getContentResolver();
MimeTypeMap mime=MimeTypeMap.getSingleton();
返回mime.getExtensionFromMimeType(cR.getType(uri));
}
公共void UpdateFood(视图五){
最终字符串名称=foodname.getText().toString();
foodprice.getText().toString();
fooddesc.getText().toString();
Storename.getText().toString();
AlertDialog.Builder=新建AlertDialog.Builder(此);
对话;
setMessage(“是否要更新此食品信息?”);
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener()
{
@凌驾
public void onClick(最终对话框接口对话框,int which)
{
pd.show();
最终数据库引用DatabaseReference=FirebaseDat
private Context mContext;
private List<FoodInfo> mfoodinfo;
private OnItemClickListener mListener;

public FoodAdapter(Context context, List<FoodInfo> mFoodInfo) {
    mContext = context;
    mfoodinfo = mFoodInfo;
}

@Override
public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.food_inflater, parent, false);
    return new ImageViewHolder(v);
}

@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
    FoodInfo foodInfo = mfoodinfo.get(position);
    holder.tvfood.setText(foodInfo.getFoodname());
    holder.tvprice.setText(foodInfo.getFoodprice());
    holder.tvdesc.setText(foodInfo.getFooddesc());

    Picasso.with(mContext)
            .load(foodInfo.getImageUrl())
            .placeholder(R.mipmap.ic_launcher)
            .fit()
            .centerCrop()
            .into(holder.imageView);
}

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

public void setFilter(List<FoodInfo> newlist) {

    mfoodinfo = new ArrayList<>();
    mfoodinfo.addAll(newlist);
    notifyDataSetChanged();
}

public void setFood(List<FoodInfo> newList) {
    this.mfoodinfo = newList;
    notifyDataSetChanged();
}



public class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
        View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener{
    public TextView tvfood,tvprice,tvdesc;
    public ImageView imageView;

    public ImageViewHolder(View itemView) {
        super(itemView);

        tvfood = itemView.findViewById(R.id.tvfoodname);
        tvprice = itemView.findViewById(R.id.tvfoodprice);
        tvdesc = itemView.findViewById(R.id.tvfooddesc);
        imageView = itemView.findViewById(R.id.imageViewfood);

        itemView.setOnClickListener(this);
        itemView.setOnCreateContextMenuListener(this);

    }





    @Override
    public void onClick(View v) {
        if (mListener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {
                mListener.onItemClick(position);
            }
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Select Action");
        MenuItem delete = menu.add(Menu.NONE, 1, 1, "Delete");
        MenuItem update = menu.add(Menu.NONE, 2, 2, "Update ");


        update.setOnMenuItemClickListener(this);
        delete.setOnMenuItemClickListener(this);
    }
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        if (mListener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {

                switch (item.getItemId()) {

                    case 1:
                        mListener.onDeleteClick(position);
                        return true;
                    case 2:
                        mListener.UpdateFood(position);
                        return true;

                }
            }
        }
        return false;
    }

}

public interface OnItemClickListener {
    void onItemClick(int position);

    void onDeleteClick(int position);

    void UpdateFood(int position);


}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}
foodAdapter.addFood(dataSnapshot.getValue(FoodInfo.class));
public void addFood(FoodInfo newFoodInfo) {
    mfoodInfo.add(newFoodInfo);
    notifyDataSetChanged();
}