2016-05-12 4 views
0

У меня есть RecyclerView, который содержит несколько данных, хранящихся на CardView после длительного нажатия. Я включаю контекстное меню, я получаю позицию конкретной карты, и я могу отображать данные на Toast также.
Но я хочу сохранить данные в списке <>, а затем получить его из другого класса активности, где я могу использовать эти данные для установки на определенном EditText.
Я не уверен, где я получаю неправильно здесь мой код: -
получения данных на длительном нажатии и хранение в СпискеПолучение данных из RecyclerView После долгого нажатия

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; 

    } 

Когда я извлечение данных на больших мыши он работает нормально, он дает данные конкретной карточки. Но когда я передаю данные в список при длительном нажатии, сначала отображаются предыдущие данные, а затем текущие данные.

Мой второй вопрос: я пытаюсь получить доступ к этому списку в другом классе, но он не работает.
код для другого класса

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(); 
      } 
     } 

Как это сделать, как я могу получить данные из одного класса в другой на длительное нажатие на вид карты. Или есть другой способ сделать это.

+0

Может я предлагаю взглянуть на это http://stackoverflow.com/questions/2091465/how-do-i-pass-data-between-activities-on- android –

+0

Возможно, вы захотите взять этот предмет при длительном нажатии и сохранить его в arraylist и перенести его на следующую активность или фрагмент. Это правильно? –

+0

Я предпочитаю для этого вариант. Использование Bundle –

ответ

0

Вы можете добавить GestureDetector к вашему RecyclerView подобное:

Прежде всего создать ArrayList, как этот

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)); 

       } 


     } 
    }); 

Тогда:

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) {} 
    }); 

И если вы хотите использовать этот список в другой класс я предлагаю вам использовать EventBus:

Ваш класс MessageListEvent:

public class MessageListEvent { 


private ArrayList<Message> messageList; 

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

} 

В вашем фрагменте или другой класс в OnCreate:

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

Тогда Override Подписаться метод:

@Subscribe 
public void onMessageEvent(MessageListEvent event){ 

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


} 

Добавьте это в build.gradle: compile 'org.greenrobot:eventbus:3.0.0'

+0

Ваш ответ не имеет отношения к его вопросу. Я так думаю –

+0

Спасибо @ Log.d, я просто сфокусирован «Мой второй вопрос: я пытаюсь получить доступ к этому списку в другом классе, но он не работает». И я предлагаю ему использовать eventbus.Он может совместить этот ответ с другими –

+0

ok я попробую это –

0

В ViewHolder адаптера вашего RecyclerVi РЭБ, вы можете сделать ...

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

Хорошо, но как я переношу его в следующий класс –

+0

Вы имеете в виду, как вы можете получить Список ваших данных из другого класса? – esfox

+0

есть. Я сделал это, но, похоже, не работает –

Смежные вопросы