2017-04-22 48 views
0

我有一个按钮,当你点击它使一个EditText编辑,第二个按钮将新的字符串到数据库,该数据库返回更新后的字符串到ListView。广东话更新火力数据库的孩子不止一个时间

它工作正常,我第一次修改,但如果我想在数据库中,但在应用程序的swiching所有的时间从新字符串老串在一个循环中再次编辑其更新的价值。

this is my FireBase Database structure:(我希望能够更新“_name”例如一个以上的时间)

,这是我的适配器:(注意“editTremp”和“submitText”按钮)

public class personalZoneAdapter extends ArrayAdapter<TrempData> { 

    static class ViewHolderItem{ 
     private TextView msg , extra,phone ,date_time ,uid ; 
     private EditText name ; 
     private ImageButton deleteTremp , editTremp , phoneBtn , submitText ; 
     private ImageView sideview; 
    } 


    private int layoutResource; 
    private FirebaseAuth firebaseAuth; 
    private DatabaseReference mDatabase; 

    public personalZoneAdapter(Context context, int layoutResource, ArrayList<TrempData> list) { 
     super(context, layoutResource, list); 
     this.layoutResource = layoutResource; 
     firebaseAuth = FirebaseAuth.getInstance(); 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Posts"); 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final ViewHolderItem viewHolder; 

     if (view == null) { 
      final LayoutInflater Inflater = LayoutInflater.from(getContext()); 
      view = Inflater.inflate(layoutResource, null); 

      viewHolder = new ViewHolderItem(); 
      viewHolder.name = (EditText) view.findViewById(R.id.user_name); 
      viewHolder.phone = (TextView) view.findViewById(R.id.user_phone); 
      viewHolder.date_time = (TextView) view.findViewById(R.id.user_date_time); 
      viewHolder.msg = (TextView) view.findViewById(R.id.user_msg); 
      viewHolder.extra = (TextView) view.findViewById(R.id.user_extra); 
      viewHolder.uid = (TextView) view.findViewById(R.id.user_uid); 
      viewHolder.deleteTremp = (ImageButton)view.findViewById(R.id.remove); 
      viewHolder.editTremp = (ImageButton)view.findViewById(R.id.edit); 
      viewHolder.phoneBtn = (ImageButton)view.findViewById(R.id.phone_btn); 
      viewHolder.submitText = (ImageButton)view.findViewById(R.id.submitText); 
      viewHolder.sideview = (ImageView)view.findViewById(R.id.user_image); 

      view.setTag(viewHolder); 
     } 
     else{ 
      viewHolder = (ViewHolderItem) convertView.getTag(); 
     } 

     final TrempData data = getItem(position); 

     //data.setPos(position); 
     //int[] androidColors = getContext().getResources().getIntArray(R.array.androidcolors); 
     //int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)]; 

     if (data != null) { 

      if (viewHolder.name != null & viewHolder.phone != null & viewHolder.msg != null & viewHolder.date_time != null & viewHolder.uid != null) { 
       viewHolder.name.setText(data.get_name()); 
       viewHolder.name.setTag(data._name); 
       //name.setTextColor(randomAndroidColor); 
       viewHolder.phone.setText(data.get_phone()); 
       viewHolder.name.setTag(data._phone); 
       viewHolder.date_time.setText(data.get_timestamp()); 
       viewHolder.name.setTag(data._timestamp); 
       viewHolder.msg.setText(data.get_from() + "--> " + data.get_to() + ", " + data.get_date() + ", " + data.get_time()); 
       viewHolder.uid.setText(data.get_uid()); 
       viewHolder.name.setTag(data._uid); 

       viewHolder.editTremp.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         viewHolder.submitText.setVisibility(View.VISIBLE); 
         viewHolder.name.setBackground(new ColorDrawable(WHITE)); 
         viewHolder.name.setEnabled(true); 
         viewHolder.name.setCursorVisible(true); 
         viewHolder.name.setFocusableInTouchMode(true); 
         viewHolder.name.setInputType(InputType.TYPE_CLASS_TEXT); 
         viewHolder.name.requestFocus(); 

        } 
       }); 

       viewHolder.submitText.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         mDatabase.addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           for (DataSnapshot ds : dataSnapshot.getChildren()) { 
            TrempData tremp = getItem(position); 
            if (ds.getKey().toString().equals(tremp.get_key())) { 
             viewHolder.name.setEnabled(false); 
             String new_name = viewHolder.name.getText().toString(); 
             viewHolder.name.setBackground(new ColorDrawable(TRANSPARENT)); 
             viewHolder.submitText.setVisibility(View.GONE); 
             data.set_name(new_name); 
             mDatabase.child(ds.getKey().toString()).child("_name").setValue(new_name); 
             notifyDataSetChanged(); 
             //Toast.makeText(getContext(),"הטרמפ עודכן בהצלחה" + position,Toast.LENGTH_SHORT).show(); 
             break; 
            } 
           } 
          } 
          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 
        } 
       }); 


       viewHolder.phoneBtn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Intent i = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + data.get_phone())); 
         getContext().startActivity(i); 
        } 
       }); 

       viewHolder.deleteTremp.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         mDatabase.addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           for (DataSnapshot ds : dataSnapshot.getChildren()) { 
            TrempData tremp = getItem(position); 
            if (ds.getKey().toString().equals(tremp.get_key())) { 
             mDatabase.child(ds.getKey().toString()).removeValue(); 
             notifyDataSetChanged(); 
             //Toast.makeText(getContext(),"הטרמפ נמחק בהצלחה",Toast.LENGTH_SHORT).show(); 
             break; 
            } 
           } 
          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 
           Toast.makeText(getContext(),"ישנה בעיה. אנא נסה שוב",Toast.LENGTH_SHORT).show(); 
          } 
         }); 
        } 
       }); 


       if(data.get_extras().length() == 0) viewHolder.extra.setVisibility(View.GONE); 
       viewHolder.extra.setText("הערות:" + " " + data.get_extras()); 

       if(firebaseAuth.getCurrentUser().getUid().equals(viewHolder.uid.getText())){ 
        viewHolder.deleteTremp.setVisibility(View.VISIBLE); 
        viewHolder.editTremp.setVisibility(View.VISIBLE); 
        viewHolder.phoneBtn.setVisibility(View.GONE); 
        viewHolder.sideview.setColorFilter(Color.rgb(255,164,30)); 
       } 
       else{ 

        viewHolder.submitText.setVisibility(View.GONE); 
        viewHolder.deleteTremp.setVisibility(View.GONE); 
        viewHolder.editTremp.setVisibility(View.GONE); 
        viewHolder.phoneBtn.setVisibility(View.VISIBLE); 
        viewHolder. sideview.setColorFilter(Color.rgb(176,176,176)); 
       } 
      } 
     } 
     return view; 
    } 
} 

回答

0

有一对夫妇与您的听众由“submitText”按钮设置回事关键的事情:

viewHolder.submitText.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mDatabase.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for (DataSnapshot ds : dataSnapshot.getChildren()) { 
           TrempData tremp = getItem(position); 
           if (ds.getKey().toString().equals(tremp.get_key())) { 
            viewHolder.name.setEnabled(false); 
            String new_name = viewHolder.name.getText().toString(); 
            viewHolder.name.setBackground(new ColorDrawable(TRANSPARENT)); 
            viewHolder.submitText.setVisibility(View.GONE); 
            data.set_name(new_name); 
            mDatabase.child(ds.getKey().toString()).child("_name").setValue(new_name); 
            notifyDataSetChanged(); 
            //Toast.makeText(getContext(),"הטרמפ עודכן בהצלחה" + position,Toast.LENGTH_SHORT).show(); 
            break; 
           } 
          } 
         } 
         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 
      }); 

首先是每次点击的屁股上,一个新的监听器正在被添加。以前的听众没有被删除,你现在有两个。理想情况下,您可以在设置阶段的某个地方添加一个监听器,并且该按钮只会触发监听器响应的更新。

第二件事是这个听众被添加到mDatabase,对mDatabase中包含的任何条目的任何更改都会触发此侦听器。在听众中还有一条线mDatabase......setValue(new_name);。这是怪异循环行为的秘诀;听众本身正在对正在监听...和循环的更改进行更改。

所以你需要做的是重新思考流动的比特和分离出不听者属于东西。监听器在安装过程中添加一次,并准备好对新数据作出反应并更新UI。该按钮只需要将新数据发送到数据库。

+0

当你说“听众”你的意思是OnclickListener或mDatabase.addValueEventListener? – Nauruto

+0

谢谢!它的工作原理..我重新思考事情的流程,如你所说,我所做的就是删除mDatabase.addValueEventListener。 – Nauruto

相关问题