2016-08-02 17 views
-1

Ich habe eine RecyclerView-Liste. Ich versuche, eine onItemLongClick-Methode in der MainActivity einzurichten, um ein DialogFragment zu starten. Der Dialog fordert den Benutzer auf zu bestätigen, dass er ein Element in der RecyclerView-Liste löschen möchte. Ich möchte die Position des RecyclerView-Elements aus der Adapterdatei erfassen, damit das Fragment das korrekte Element aus einer SQLite-Datenbank löschen kann.Android RecyclerView: Wie lege ich Daten in ein Fragment vom Adapter?

Ich versuche, die RecyclerView Artikelposition in einem Bundle mit SetArguments zu übergeben. Android Studio gibt den folgenden Fehler in der Zeile "bundle.putInt" aus: Falscher 2. Argumenttyp. Gefunden: 'Kontakt' (mein Datenmodell), benötigt 'int'. Was fehlt mir hier?

p.s. Ich habe auch eine "onItemClick" -Methode, die korrekt eine andere Aktivität namens "ActActivity" lädt, die auch unten als Referenz gezeigt wird. Sowohl onItemClick als auch onItemLongClick werden mit einer ClickListener-Schnittstelle in der Adapterdatei eingerichtet. Beide Klickmethoden wurden mit Toast getestet und funktionieren gut.

Von Activity-Datei:

... 
@Override 
public void onItemLongClick(int position, View view) { 
    // For API >=14, use getFragmentManager() below. 
    Bundle bundle = new Bundle(); 
    bundle.putInt("item position", **contactListAdapter.getItem(position)**); // error here. 

    android.app.FragmentManager fm = getFragmentManager(); 
    fm.setArguments(bundle); 
    DeleteCardViewFragment delCardViewDialog = new DeleteCardViewFragment(); 
    delCardViewDialog.show(fm,"delcardview dialog"); 
} 

@Override 
public void onItemClick(int position, View view) { 
    ActActivity.start(this, contactListAdapter.getItem(position)); 
} 

Von RecyclerView der Adapter-Datei:

public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ContactHolder>{ 

    private List<Contact> contactList; 
    private Context context; 

    private RecyclerItemClickListener recyclerItemClickListener; 

    public ContactListAdapter(Context context) { 
     this.context = context; 
     this.contactList = new ArrayList<>();  
    ... 

    **public Contact getItem(int position)** { 
     return contactList.get(position); 
    } 

Fragment-Datei:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) {  
... 
Button btnOK = (Button) rootView.findViewById(R.id.btnOK); 
    btnOK.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
             // removeItem() here? 
      dismiss(); 
     } 
    }); 
+0

aber Sie haben bereits 'position' in' onItemLon gKlicken Sie (int-Position, Ansicht anzeigen) 'als erstes Argument, verwenden Sie also –

+0

ersetzen Sie einfach 'contactListAdapter.getItem (Position)' mit 'Position'? – AJW

+0

von wo Sie die Daten in der Liste Fragment oder Aktivität ?? –

Antwort

0

Die bundle.putInt Funktion eine ganze Zahl im zweiten Argument erwartet, Du gibst einen 'Kontakt' ein. Pass 'Position' als zweites Argument statt 'contactListAdapter.getItem (Position)'

+0

Ok, ich werde das versuchen. Jetzt das "fm.setArguments (bundle);" zeigt einen Fehler an: Methode kann nicht aufgelöst werden. Irgendwelche Ideen? – AJW

1

Ihre Aktivität Machen View.OnLongClinkListner

View.OnLongClinkListner mLongClickListner; 
public ContactListAdapter(Context context) { 

mLongClickListner=(View.OnLongClinkListner)context; 
} 

@Override 
     public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = inflater.inflate(R.layout.some_layout, parent, false); 
view.setOnLongClickListner(mLongClickListner); 
      return new ContactHolder(view); 
     } 



@Override 
     public void onBindViewHolder(final ContactHolder holder, final int position) { 
... your code; 
holder.itemView.setTag(position); 
} 

/

public class MainActivity extends AppCompatActivity implements View.OnLongClinkListner { 
@Override 
    public boolean onLongClick(View v) { 
int position=(Integer)v.getTag(); 
     return false; 
    } 
} 



public void remove(int position){ 
    adapter.remove(position); 
} 

Und in Ihrem Adapter zu implementieren/um Artikel aus der Recycler-Ansicht zu entfernen

public void removeItem(int position) 
{ 
contactList.remove(position); 
notifyDataSetChanged(); 
} 
+0

Interessant, ich werde es versuchen. Wäre der Code zum Starten von DialogFragment in Ihrem Abschnitt 'public boolean onLongClick' hinzugefügt worden? – AJW

+0

Ja '' 'DialogFragment frag = neu DialogFragment(); Bundle args = neues Bundle(); args.putInt ("pos", Position); frag.setArguments (args); '' ' Jetzt zeigen Sie Ihr Fragment. –

+0

Ok. Wie referenziere ich dann die Artikelposition vom Adapter im Fragment, damit ich den Löschcode hinzufügen kann? – AJW