您好我使用自定义适配器分配我处理firebase对象的方式,然后使用对话框为我的片段分配变量。我需要帮助,因为我分配的数据没有进入我的火力库。我可以问为什么? *编辑添加信息类和数据库模式
我的适配器代码
public class UserTransactionAdapter extends RecyclerView.Adapter<UserTransactionAdapter.ViewHolder> {
private List<Info> mInfo;
private Callback mCallback;
private DatabaseReference userref;
public UserTransactionAdapter(Callback callback) {
mCallback = callback;
mInfo = new ArrayList<>();
userref = FirebaseDatabase.getInstance().getReference().child("Transactions");
userref.addChildEventListener(new UserChildEventListener());
}
class UserChildEventListener implements ChildEventListener{
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Info info = dataSnapshot.getValue(Info.class);
info.setKey(dataSnapshot.getKey());
mInfo.add(0,info);
notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
String key = dataSnapshot.getKey();
Info updatedInfo = dataSnapshot.getValue(Info.class);
for (Info info : mInfo){
if (info.getKey().equals(key)){
info.setValues(updatedInfo);
notifyDataSetChanged();
return;
}
}
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
for(Info info: mInfo){
if (info.getKey().equals(key)){
mInfo.remove(info);
break;
}
}
notifyDataSetChanged();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelinfo, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final Info info = mInfo.get(position);
holder.mNameTextView.setText(info.getName());
holder.mMonthTextView.setText(info.getMonth());
holder.mPayTextView.setText(info.getPay());
holder.mUntilTextView.setText(info.getUntil());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallback.onEdit(info);
}
});
}
public void remove(Info info) {
//TODO: Remove the next line(s) and use Firebase instead
userref.child(info.getKey()).removeValue();
}
@Override
public int getItemCount() {
return mInfo.size();
}
public void add(Info info) {
//TODO: Remove the next line(s) and use Firebase instead
userref.push().setValue(info);
}
public void update(Info info, String newName,String newMonth,String newPay, String newUntil) {
//TODO: Remove the next line(s) and use Firebase instead
info.setName(newName);
info.setMonth(newMonth);
info.setPay(newPay);
info.setUntil(newUntil);
userref.child(info.getKey()).setValue(info);
}
public interface Callback {
public void onEdit(Info info);
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView mNameTextView;
private TextView mMonthTextView;
private TextView mPayTextView;
private TextView mUntilTextView;
public ViewHolder(View itemView) {
super(itemView);
mNameTextView = (TextView) itemView.findViewById(R.id.nameTxt);
mMonthTextView = (TextView) itemView.findViewById(R.id.monthTxt);
mPayTextView = (TextView) itemView.findViewById(R.id.payTxt);
mUntilTextView = (TextView) itemView.findViewById(R.id.untilTxt);
}
}
我的片段代码
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.fragment_transaction, container, false);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showAddEditDialog(null);
}
});
mAdapter = new com.google.firebase.ikuzou.database.UserTransactionAdapter(this);
RecyclerView view1 = (RecyclerView) view.findViewById(R.id.recycler_view);
view1.setLayoutManager(new LinearLayoutManager(getContext()));
view1.setHasFixedSize(true);
view1.setAdapter(mAdapter);
return view;
}
private void showAddEditDialog(final Info info) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(getString(info == null ? R.string.dialog_add_title2 : R.string.dialog_edit_title2));
View view = getLayoutInflater().inflate(R.layout.dialog_info, null, false);
builder.setView(view);
final EditText nameEditText = (EditText) view.findViewById(R.id.nameEditText);
final EditText monthEditText = (EditText) view.findViewById(R.id.monthEditText);
final EditText payEditText = (EditText) view.findViewById(R.id.payEditText);
final EditText untilEditText = (EditText) view.findViewById(R.id.untilEditText);
if (info != null) {
// pre-populate
nameEditText.setText(info.getName());
monthEditText.setText(info.getMonth());
payEditText.setText(info.getPay());
untilEditText.setText(info.getUntil());
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// empty
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// empty
}
@Override
public void afterTextChanged(Editable s) {
String name = nameEditText.getText().toString();
String month = monthEditText.getText().toString();
String pay = payEditText.getText().toString();
String until = untilEditText.getText().toString();
mAdapter.update(info, name,month,pay,until );
}
};
nameEditText.addTextChangedListener(textWatcher);
monthEditText.addTextChangedListener(textWatcher);
payEditText.addTextChangedListener(textWatcher);
untilEditText.addTextChangedListener(textWatcher);
}
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (info == null) {
String name = nameEditText.getText().toString();
String month = monthEditText.getText().toString();
String pay = payEditText.getText().toString();
String until = untilEditText.getText().toString();
mAdapter.add(new Info(name, month,pay,until));
}
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
我可以知道我的代码上的错误,以便我知道为什么会这样吗?或者也许是因为我还没有创建一个交易节点,这就是为什么会发生这种情况?
修改 我尝试手动添加子节点,现在我正在
DatabaseException:无法将java.lang.String类型的对象转换为 类型错误
这是我的信息类代码
public class Info {
private String name,month,pay,until,key;
public Info (){
}
public Info(String name, String month, String pay, String expire) {
this.name= this.name;
this.month= this.month;
this.pay= this.pay;
this.until= this.until;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getMonth(){
return month;
}
public void setMonth(String month){
this.month=month;
}
public String getPay(){
return pay;
}
public void setPay(String pay){
this.pay=pay;
}
public String getUntil(){
return until;
}
public void setUntil(String until){
this.until=until;
}
@Exclude
public String getKey(){
return key;
}
public void setKey(String key){
this.key = key;
}
public void setValues(Info updatedInfo) {
this.name=updatedInfo.name;
this.month=updatedInfo.month;
this.pay=updatedInfo.pay;
this.until=updatedInfo.until;
}
我的数据库
答案 0 :(得分:0)
您添加了一个childEventListner,所有这些功能只有在“事务”节点下添加,删除或更改子项时才会运行。因此,请尝试将子项添加到节点“Transactions”。
根据文档,child_added会为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发。
参考:https://firebase.google.com/docs/database/admin/retrieve-data
答案 1 :(得分:0)
userref.child(info.getKey()).setValue(info);
这一行应该是这样的。
userref.child(info.getKey()).push().setValue(info);
答案 2 :(得分:0)
固定IT。我的 Info.class
是一个愚蠢的错误添加了这个。
public Info(String name, String month, String pay, String expire) {
this.name= this.name;
this.month= this.month;
this.pay= this.pay;
this.until= this.until;
而不是
this.name= name;
this.month= month;
this.pay= pay;
this.until= until;
所以解决方案就是删除这个并简单地把月,付,直到
现在通过删除此
解决问题