2015-06-13 6 views
0

В настоящее время мы разрабатываем приложение для Android, но мы входим в проблему.Как получить правильный элемент из recyclerView

У нас есть recyclerView, которые заполняются CardView на основе результатов базы данных. Внутри CardView есть кнопка.

Теперь мы пытаемся создать эффект onclick на кнопке (это работает).

Но когда мы нажимаем кнопку в cardView, мы хотим, чтобы код возвращал идентификатор specefic для этого cardView.

Мы пытались использовать

getParent() 

но возвращает тот же cardview даже если нажать кнопку на другом cardView. Возможно ли это, не создавая onClick самого recyclerView?

Мы хотим, чтобы уникальный идентификатор cardview

Edit:

Мы хотим, чтобы кнопка на карту, чтобы извлечь информацию на этой карте

Фрагмент:

package info.androidhive.materialnavbar.fragment; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import info.androidhive.materialnavbar.Activity.MainActivity; 
import info.androidhive.materialnavbar.CardItem; 
import info.androidhive.materialnavbar.R; 
import info.androidhive.materialnavbar.ViewAdapters.RVAdapter; 

/** 
* Created by bart on 10-6-2015 
* 2015 - 06 
* Superclass for all Information Fragments 
* Class handles the inflation of the RecyclerView and the XML files 
*/ 

public class InformationFragment extends Fragment { 
    private RecyclerView recyclerView; 
    private RVAdapter mRecyclerViewAdapter; 
    private View containerView; 
    private static List<CardItem> CardEntry; 
    private Map<Integer, String> mFragmentTags; 
    public static boolean refresh = false; 



    //haalt list leeg 
    public void refreshFragment(){ 
      // zet fragment op null 
      Fragment frg = null; 
      frg = getFragmentManager().findFragmentById(2131296339); 
      final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.detach(frg); 
      ft.attach(frg); 
      ft.commit(); 
    } 

    // recycler list 
    public List<CardItem> getCardData(int type) { 
     CardEntry = new ArrayList<>(); 
     // tijdelijk knop voor testing 
     int reporticon = R.drawable.reporttemp; 
     switch (type) { 
      case 0: 
       // Vull kaartjes met volgende items : 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       CardEntry.add(new CardItem("Today", "string a", R.drawable.ic_facts,reporticon)); 
       //workaround 
       //zet case type om naar cardcounter > inflater > refresh 
       MainActivity.cardcounter = 0; 
       if (!refresh){ 
       refreshFragment(); 
        refresh = true; 
       } 
       break; 
      case 1:       // V title Vcontent V img 
       CardEntry.add(new CardItem("Facts", "string a", R.drawable.ic_birthdays,reporticon)); 
       //workaround 
       MainActivity.cardcounter = 1; 
       if (!refresh){ 
        refreshFragment(); 
        refresh = true; 
       } 
       break; 
      case 2: 
       CardEntry.add(new CardItem("History", "string a", R.drawable.ic_history,reporticon)); 
       //workaround 
       MainActivity.cardcounter = 2; 
       if (!refresh){ 
        refreshFragment(); 
        refresh = true; 
       } 
       break; 
      case 3: 
       CardEntry.add(new CardItem("Birthday", "string a", R.drawable.ic_lifehacks,reporticon)); 
      //workaround 
      MainActivity.cardcounter = 3; 
      if (!refresh){ 
       refreshFragment(); 
       refresh = true; 
      } 
      break; 
      case 4: 
       CardEntry.add(new CardItem("Lifehacks", "string a", R.drawable.ic_facts,reporticon)); 
       //workaround 
       MainActivity.cardcounter = 4; 
       if (!refresh){ 
        refreshFragment(); 
        refresh = true; 
       } 
       break; 
      case 5: 
       CardEntry.add(new CardItem("Quotes", "string a", R.drawable.ic_facts,reporticon)); 
       //workaround 
       MainActivity.cardcounter = 5; 
       if (!refresh){ 
        refreshFragment(); 
        refresh = true; 
       } 
       break; 
      case 6: 
       CardEntry.add(new CardItem("Favorites", "string a", R.drawable.ic_facts,reporticon)); 
       //workaround 
       MainActivity.cardcounter = 6; 
       if (!refresh){ 
        refreshFragment(); 
        refresh = true; 
       } 
       break; 
     } 
     return CardEntry; 
    } 


    public List<CardItem> getCardEntry() { 
     return CardEntry; 
    } 
    // end recycler 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
      // Inflate the layout for this fragment * iets aangepast, return onderaan voor recycler drawer 
      View layout = inflater.inflate(R.layout.fragment_content, container, false); 
      // pak het id van de recycler uit xml 
      recyclerView = (RecyclerView) layout.findViewById(R.id.RecyclerCardList); 
      // haal de data op uit de return/switch hier boven 
      // 
      mRecyclerViewAdapter = new RVAdapter(getCardData(MainActivity.cardcounter)); 
      // 
      recyclerView.setAdapter(mRecyclerViewAdapter); 
      // zet hem als dit op deze activity 
      recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
       return layout; 
    } 

} 

адаптер :

package info.androidhive.materialnavbar.ViewAdapters; 

import android.content.Context; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.List; 

import info.androidhive.materialnavbar.Activity.DownloadImageTask; 
import info.androidhive.materialnavbar.Animations; 
import info.androidhive.materialnavbar.CardItem; 
import info.androidhive.materialnavbar.R; 

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> { 


    // Recycler View Adapter 
    public static class PersonViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView personName; 
     TextView personAge; 
     ImageView personPhoto; 
     ImageButton FavBut; 
     ImageButton ReportBut; 

     PersonViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView) itemView.findViewById(R.id.cv); 
      personName = (TextView) itemView.findViewById(R.id.person_name); 
      personAge = (TextView) itemView.findViewById(R.id.person_age); 
      personPhoto = (ImageView) itemView.findViewById(R.id.person_photo); 
      FavBut = (ImageButton) itemView.findViewById(R.id.FavBut); 
      ReportBut = (ImageButton) itemView.findViewById(R.id.ReportBut); 

     } 
    } 

    List<CardItem> cardItems; 

    public RVAdapter(List<CardItem> cardItems) { 
     this.cardItems = cardItems; 
    } 


    public Object getCard(int position) { 
     return cardItems.get(position); 
    } 

    public List<CardItem> getCardItems() { 
     return cardItems; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.carditem, viewGroup, false); 
     PersonViewHolder pvh = new PersonViewHolder(v); 
     return pvh; 
    } 


    // de 'onCreate' 
    @Override 
    public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { 
     // vult het object/element met 
     personViewHolder.personName.setText(cardItems.get(i).name); 
     personViewHolder.personAge.setText(cardItems.get(i).age); 
     personViewHolder.personPhoto.setImageResource(cardItems.get(i).photoId); 
     //fav 
     personViewHolder.FavBut.setImageResource(cardItems.get(i).favId); 
     //report 
     personViewHolder.ReportBut.setImageResource(cardItems.get(i).reportId); 

     //zet animation op dit object/element 
     Animations.animateScatter(personViewHolder, true); 


    } 


    @Override 
    public int getItemCount() { 
     return cardItems.size(); 
    } 

} 
+0

Что вы пытаетесь сделать с идентификатором View? Я думаю, вы получаете одинаковый идентификатор, потому что RecyclerView повторно использует Views. –

+0

можете ли вы опубликовать класс Adapter & Fragment? –

+0

Я обновил проблему, так что теперь она более конкретна. – Lozeputten

ответ

1

Создайте интерфейс, как этот

public static interface ItemClickListener<T>{ 
    void onItemClick(T itemdata); 
} 

Создать Фейлд в адаптере и инициализировать это в конструкторе, как этот

ItemClickListener<CardItem> mItemClickListener; 

public ClientsAdapter(ItemClickListener<CardItem> itemClickListener) { 
    mItemClickListener = itemClickListener; 
} 

И в вашем безвыходном

@Override 
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { 
final CardItem item = mCardItems.get(i); 
personViewHolder.FavBut.setOnClickListener(new OnClickListener(){ 
    public void onClick(View v){ 
     mItemClickListener.onItemClick(item); 
    } 

}); 

И в вашем фрагменте реализации интерфейса ItemClickListener и передать его на адаптер

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