2016-05-12 8 views
0

Ich habe eine RecyclerView, die enthält mehrere Daten gespeichert CardView nach langem Drücken ich ein Kontextmenü aktivieren, bekomme ich die Position der bestimmten Karte und ich bin in der Lage, die Daten auf Toast anzuzeigen ebenfalls.
Aber was ich tun möchte ist, die Daten in der Liste speichern <> und dann aus einer anderen Aktivitätsklasse abrufen, wo ich diese Daten verwenden kann, um bestimmte bestimmte EditText setzen.
Ich bin nicht sicher, wo ich hier falsch bin immer mein Code: -
bekommen Daten über lange drücken und Speicherung in ListDaten aus einer RecyclerView abrufen Nach langem Drücken

public List<String> Data=new ArrayList<>(); 
TextView name,qunat,refill; 
String nameMed,quantity,refillAmt; 

    @Override 
      public void onItemLongClick(View view, int position) { 
      name = (TextView) view.findViewById(R.id.nameOfUpmingMed); 
      qunat=(TextView)view.findViewById(R.id.QuantOfMed); 
      refill=(TextView)view.findViewById(R.id.ReffilAmt); 
      nameMed = name.getText().toString(); 
      quantity=qunat.getText().toString(); 
      refillAmt=refill.getText().toString(); 
      passData(nameMed,quantity,refillAmt,); 
//   Data.add(nameMed);Data.add(quantity);Data.add(refillAmt); 

      } 
     })); 

public List<String> passData(String name, String quant, String refillAmt){ 
     String Name,Quant,Refill; 
     Name=name;Quant=quant;Refill=refillAmt; 
     Data.add(Name); 
     Data.add(Quant); 
     Data.add(Refill); 
     for(int i=0;i<Data.size();i++){ 
      Toast.makeText(getActivity(), "Pressed card is and "+Data.get(i), Toast.LENGTH_SHORT).show(); 
     } 
     return Data; 

    } 

Wenn ich Daten auf lange bin Abrufen klicken, um es funktioniert gut, es gibt die Daten einer bestimmten Karte gedrückt. Aber wenn ich die Daten bei langem Drücken übergebe, werden zuerst die zuvor gedrückten Daten und dann die aktuellen Daten angezeigt.

Meine zweite Frage ist, ich versuche, auf diese Liste in einer anderen Klasse zuzugreifen, aber es funktioniert nicht.
Code für andere Klasse ist

prescriptionFragment=new PrescriptionFragment(); 
for(int i=0;i < prescriptionFragment.Data.size();i++){ 
      if(i==0){ 
       Toast.makeText(getApplication(),"data is "+prescriptionFragment.Data.get(i),Toast.LENGTH_LONG).show(); 
      } 
     } 

Wie dies zu tun, wie ich Daten von einer Klasse zur anderen kann auf lange Drücken einer Karte Ansicht. Oder gibt es einen anderen Weg, dies zu tun?

+0

Darf ich einen Blick auf diese schlage vor, http://stackoverflow.com/questions/2091465/how-do-i-pass-data-between-activities-on- android –

+0

Vielleicht möchten Sie das Objekt, wenn lange gedrückt halten und es zu arraylist speichern und das zur nächsten Aktivität oder Fragment forttragen. Ist das richtig? –

+0

Ich bevorzuge parzellierbar dafür. Verwenden des Bundles –

Antwort

0

Sie GestureDetector zu Ihrem RecyclerView so hinzufügen:

Zunächst einmal schaffen eine Arraylist, wie die

List <Message> longPressedList=new ArrrayList<Message>(); 


final GestureDetector messageGestureDetector = new GestureDetector(MessageActivity.this, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerviewmessages.findChildViewUnder(e.getX(), e.getY()); 
      Message longClickedMessage= new Message(); 
       if (recyclerviewmessages.getChildPosition(child) >= 0 && recyclerviewmessages.getChildPosition(child) <= Messages.size()) { 
        longClickedMessage= Messages.get(recyclerviewmessages.getChildPosition(child)); 
        //add to arraylist 
        longPressedList.add(longClickedMessage); 
        //send new list to other class 
        EventBus.getDefault().postSticky(new MessageListEvent (longPressedList)); 

       } 


     } 
    }); 

Dann:

recyclerviewmessages.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 
     @Override 
     public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
      View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); 

      if (child != null && messageGestureDetector.onTouchEvent(motionEvent)) { 
       //here your recyclerview touch event if matchs gesture detector 
       //you return true , else return false 

       return true; 
      } 

      return false; 
     } 

     @Override 
     public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {} 

     @Override 
     public void onRequestDisallowInterceptTouchEvent(boolean b) {} 
    }); 

Und wenn Sie wollen, diese Liste verwenden zu einer anderen Klasse empfehle ich Ihnen, EventBus zu verwenden:

Ihre MessageListEvent Klasse:

public class MessageListEvent { 


private ArrayList<Message> messageList; 

public MessageListEvent (ArrayList<Message> messages){ 
    this.messageList=messages; 

} 

In Ihrem Fragment oder einer anderen Klasse in oncreate:

if (!EventBus.getDefault().isRegistered(this)) { 
     EventBus.getDefault().register(this); 
    } 

Dann Methode außer Kraft setzen Abonnieren:

@Subscribe 
public void onMessageEvent(MessageListEvent event){ 

     //you can get list like that : event.messageList 


} 

diese build.gradle zu Ihrer hinzufügen: compile 'org.greenrobot:eventbus:3.0.0'

+0

Ihre Antwort ist für seine Frage nicht relevant. Ich denke so –

+0

Danke @ Log.d, ich habe mich gerade konzentriert "Meine zweite Frage ist, ich versuche, auf diese Liste in einer anderen Klasse zugreifen, aber es funktioniert nicht" Motto. Und ich schlage ihm vor, Eventbus zu benutzen.Er kann diese Antwort mit anderen kombinieren –

+0

ok ich werde das versuchen –

0

Im ViewHolder des Adapters Ihres RecyclerVi ew, die Sie tun können ...

class YourViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener 
{ 
    TextView name, qunat, refill; 

    public YourViewHolder(View view) 
    { 
     super(view); 
     name = (TextView) view.findViewById(R.id.nameOfUpmingMed); 
     qunat=(TextView)view.findViewById(R.id.QuantOfMed); 
     refill=(TextView)view.findViewById(R.id.ReffilAmt); 

     view.setOnLongClickListener(this); 
    } 

    @Override 
    public boolean onLongClick(View v) 
    { 
     String nameMed = name.getText().toString(); 
     String quantity = qunat.getText().toString(); 
     String refillAmt = refill.getText().toString(); 
     passData(nameMed,quantity,refillAmt,); 
     //Do other stuff you need to do. 
     return true; 
    } 
} 
+0

Ok, aber wie trage ich es zur nächsten Klasse –

+0

Meinst du, wie Sie die Liste Ihrer Daten aus einer anderen Klasse bekommen können? – esfox

+0

ja. Ich habe das getan, aber es scheint nicht zu funktionieren –