首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Adapter.notifydatasetchanged在RecyclerView中不起作用

Adapter.notifydatasetchanged在RecyclerView中不起作用
EN

Stack Overflow用户
提问于 2018-06-03 19:00:40
回答 1查看 518关注 0票数 1

好了,伙计们,我有一个刷新适配器的问题,当我在回收视图中更新项目后,它在firebase中发生了变化,但在我的回收视图中没有变化,我不得不再次打开活动,然后它只显示最新的信息。

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

代码语言:javascript
复制
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;
}

}

FoodAdapter.java

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-03 21:40:52

您必须更新FoodAdapter中的数据集,否则不会更改任何内容。由于您没有发布您的Adapter代码,我可以假设这是什么样子的:

代码语言:javascript
复制
foodAdapter.addFood(dataSnapshot.getValue(FoodInfo.class));

以及适配器中addFood方法的代码:

代码语言:javascript
复制
public void addFood(FoodInfo newFoodInfo) {
    mfoodInfo.add(newFoodInfo);
    notifyDataSetChanged();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50665651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档