- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 Firebase 的新手。我正在尝试更新 firebase 数据库中的 RecyclerView 数据,同时在我的 RecyclerView 数据中动态反射(reflect)相同的更新值。即使有人试图从 firebase 控制台本身更新数据,更改也必须反射(reflect)在 recyclerView 中。 我的列表中有一个 seekBar,每次更改列表中的数据时,它都必须反射(reflect)回数据库中。问题是,每次我尝试从 recyclerView 列表本身更改数据时,firebase 数据库中的数据都会发生变化,而 firebase 数据库又调用 onDataChanged() 并使我的整个 recyclerView 再次重新加载而不显示更新的数据名单。请帮忙。
Below I am posting my listfragment as well as adapter class code:
ListFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_slc_list, container, false);
slcList = (RecyclerView)v.findViewById(R.id.addedSlcList);
noSLC = (TextView)v.findViewById(R.id.noSLCText);
fragmentManager= myContext.getSupportFragmentManager();
slcList.setHasFixedSize(true);
ref = new Firebase(Config.FIREBASE_URL);
list = new ArrayList<slcItem>();
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
// dAdapter = new slcListAdapter(myContext,list, ref );
// slcList.setLayoutManager(llm);
// slcList.setAdapter(dAdapter);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
Log.d("clear","cleared");
list.clear();
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
Log.v("2nd",""+ childDataSnapshot.getKey()); //displays the key for the node
Log.v("2nd",""+ childDataSnapshot.getValue());
Slc val= childDataSnapshot.getValue(Slc.class);
Log.v("2ndClass",""+ val.getOn_off());
slcItem item = new slcItem();
item.setSlcOnOff(val.getOn_off());
item.setSlcID(val.getUser_id());
item.setSlcProgress(val.getDimming_val());
item.setSlcName(childDataSnapshot.getKey());
item.setSlcStatus(val.getStatus());
list.add(item);
LinearLayoutManager llm1 = new LinearLayoutManager(getActivity());
dAdapter = new slcListAdapter(myContext,list, ref );
dAdapter.notifyDataSetChanged();
slcList.setLayoutManager(llm1);
slcList.setAdapter(dAdapter);
}
for(int i=0; i<list.size();i++)
{
Log.d("animesh",list.get(i).getSlcName()+" "+list.size()+" "+dataSnapshot.getChildrenCount());
}
if(dataSnapshot.getChildrenCount() == 0)
{
LinearLayoutManager llm1 = new LinearLayoutManager(getActivity());
dAdapter = new slcListAdapter(myContext,list, ref );
getActivity().runOnUiThread(new Runnable() {
public void run() {
dAdapter.notifyDataSetChanged();
}
});
slcList.setLayoutManager(llm1);
slcList.setAdapter(dAdapter);
}
}
@Override
public void onCancelled(FirebaseError firebaseError)
{
Log.d("animesh",firebaseError+"");
}
});
Log.d("anilist",list.size()+"");
Adapter class:
public slcListAdapter(Context context,ArrayList<slcItem> list, Firebase ref ) {
super();
this.context=context;
this.list=list;
this.ref=ref;
dItems = new ArrayList<slcItem>();
for(int i=0;i<list.size();i++)
{
slcItem deal = new slcItem();
deal.setSlcName(list.get(i).getSlcName());
dItems.add(deal);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.single_slc_row, viewGroup, false);
viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
int v;
nature = dItems.get(i);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren())
{
Log.d("animesh",childDataSnapshot.toString());
Slc val = childDataSnapshot.getValue(Slc.class);
// viewHolder.dimming.setProgress(val.getDimming_val());
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
viewHolder.name.setText(nature.getSlcName());
viewHolder.inv.setVisibility(View.GONE);
viewHolder.onOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Log.d("checkani",nature.getSlcName());
if(isChecked){
ref.child(list.get(i).getSlcName()).child("on_off").setValue(1);
}else{
ref.child(list.get(i).getSlcName()).child("on_off").setValue(0);
Log.d("Ani",list.get(i).getSlcName());
}
}
});
viewHolder.dimming.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
Log.d("dimming",nature.getSlcName());
ref.child(list.get(i).getSlcName()).child("dimming_val").setValue(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
viewHolder.expand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
// ViewAnimationsUtils.expand(viewHolder.inv);
viewHolder.collapse.setVisibility(View.VISIBLE);
viewHolder.inv.setVisibility(View.VISIBLE);
viewHolder.expand.setVisibility(View.GONE);
}
});
viewHolder.collapse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
// ViewAnimationsUtils.collapse(inv);
viewHolder.inv.setVisibility(View.GONE);
viewHolder.expand.setVisibility(View.VISIBLE);
viewHolder.collapse.setVisibility(View.GONE);
}
});
viewHolder.edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.update_slc);
dialog.setCancelable(false);
Window window = dialog.getWindow();
if(window == null) return;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(lp);
final EditText name = (EditText) dialog.findViewById(R.id.slcNameu);
final EditText id = (EditText) dialog.findViewById(R.id.slcIDu);
TextView cancel = (TextView) dialog.findViewById(R.id.cancelu);
TextView update = (TextView) dialog.findViewById(R.id.updateSlc);
// update.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v)
// {
// final String Sname = nature.getSlcName();
// Map mParent = new HashMap();
// mParent.put("user_id", id.getText().toString().trim());
// mParent.put("on_off", nature.getSlcOnOff());
// mParent.put("status", nature.getSlcStatus());
// mParent.put("dimming_val",nature.getSlcProgress());
// ref.child(name.getText().toString().trim()).setValue(mParent, new Firebase.CompletionListener()
// {
// @Override
// public void onComplete(FirebaseError firebaseError, Firebase firebase) {
// Log.d("aniNature","Value was set. Error = "+firebaseError+" "+nature.getSlcName()+" "+Sname);
// ref.child(Sname).removeValue();
// dialog.dismiss();
// }
// });
//
// }
// });
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
viewHolder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setTitle("Delete Slc?");
dialog.setContentView(R.layout.delete_slc);
dialog.setCancelable(false);
Window window = dialog.getWindow();
if(window == null) return;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(lp);
TextView delete = (TextView)dialog.findViewById(R.id.deleteSlc);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Log.d("delete1",nature.getSlcName());
ref.child(list.get(i).getSlcName()).removeValue();
Log.d("delete",nature.getSlcName());
dialog.dismiss();
}
});
TextView dialogButton = (TextView) dialog.findViewById(R.id.canceld);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
dialog.dismiss();
}
});
dialog.show();
}
});
}
@Override
public int getItemCount()
{
return dItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView name;
public Switch onOff;
public SeekBar dimming;
public TextView edit;
public TextView delete;
public TextView expand;
public TextView collapse;
public LinearLayout inv;
public ViewHolder(View itemView)
{
super(itemView);
name = (TextView) itemView.findViewById(R.id.slcName);
onOff = (Switch) itemView.findViewById(R.id.slcONOFFSwich);
dimming=(SeekBar) itemView.findViewById(R.id.slcDimming);
edit = (TextView) itemView.findViewById(R.id.EditSlc);
delete = (TextView) itemView.findViewById(R.id.DeleteSlc);
expand = (TextView) itemView.findViewById(R.id.down);
collapse = (TextView) itemView.findViewById(R.id.up);
inv = (LinearLayout) itemView.findViewById(R.id.invisibleLayout);
}
}
}
最佳答案
如果你想响应子级别的变化,你应该使用 ChildEventListener
.当添加、删除、更改或移动子项时,此接口(interface)具有单独的方法(onChildAdded
、onChildRemoved
、onChildChanged
和 onChildMoved
分别)。
请注意,在这种情况下,您需要做更多的工作以确保项目在 list
中保持正确的顺序。例如:您需要跟踪每个项目的键,以便您可以将其与 onChildAdded
和 onChildChanged
中的 previousKey
参数进行比较。
有关此类适配器的工作实现示例,我建议查看 FirebaseUI 的 FirebaseRecyclerAdapter
及其基础FirebaseArray
.
关于android - 每次更新 firebase 数据库数据时都会加载 RecyclerView 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42787797/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!