0

Ich habe also eine CardView in einem RecyclerView, die einige Daten enthält. Ich möchte auf eine bestimmte Karte klicken und ein neues Fragment starten, das bestimmte Daten aus den Daten in der CardView anzeigt (mehr Details über die Daten in der CardView). Hier ist der relevante Code.Daten von CardView in RecyclerView an neues Fragment senden?

Ich habe nicht die meisten Erfahrung in der Programmierung und Android im Allgemeinen, jede Hilfe wäre willkommen!

DetailsFragment: `

public class DetailsFragment extends Fragment { 

private CardView cardView; 

private RecyclerView rv; 

private List<Detail> detailList = new ArrayList<>(); 


public DetailsFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_details, container, false); 

    Context context = getActivity(); 
    cardView = (CardView) rootView.findViewById(R.id.cv); 
    rv = (RecyclerView) rootView.findViewById(R.id.rv); 

    final LinearLayoutManager llm = new LinearLayoutManager(context); 
    rv.setLayoutManager(llm); 

    RVDetailAdapter adapter = new RVDetailAdapter(detailList); 
    rv.setAdapter(adapter); 

    initializeData(); 
    initializeAdapter(); 

    return rootView; 

} 

private void initializeData() { 
    detailList = new ArrayList<>(); 
    //  not sure here 
    detailList.add(new Detail(" ")); 
} 

private void initializeAdapter(){ 
    RVDetailAdapter adapter = new RVDetailAdapter(detailList); 
    rv.setAdapter(adapter); 
} 

} 

RVNewsAdapater:

public class RVNewsAdapter extends RecyclerView.Adapter<RVNewsAdapter.NewsViewHolder> { 

public static final String KEY_LINK ="link"; 

public static class NewsViewHolder extends RecyclerView.ViewHolder 
    implements View.OnClickListener { 
    private static final String TAG = "Hello"; 
    CardView cv; 
    TextView date; 
    TextView link; 
    TextView title; 
    TextView today; 


    public NewsViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView) itemView.findViewById(R.id.cv); 
     date = (TextView) itemView.findViewById(R.id.date); 
     link = (TextView) itemView.findViewById(R.id.link); 
     title = (TextView) itemView.findViewById(R.id.heading); 
     today = (TextView) itemView.findViewById(R.id.today); 

     itemView.setOnClickListener(this); 
    } 


    @Override 
    public void onClick(View view) { 
     Context context = view.getContext(); 

     Intent intent = null; 

     for(int postion = 0; postion<42; postion++) { 
      intent = new Intent(context, Details.class); 

     } 

     context.startActivity(intent); 
    } 



} 

List<News> news; 

RVNewsAdapter(List<News> news) { 
    this.news = news; 
} 

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

@Override 
public RVNewsAdapter.NewsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.itemnewsfeed, viewGroup, false); 
    NewsViewHolder nvh = new NewsViewHolder(v); 
    return nvh; 
} 

@Override 
public void onBindViewHolder(NewsViewHolder newsViewHolder, int i) { 
    newsViewHolder.date.setText(news.get(i).date); 
    newsViewHolder.link.setText(news.get(i).link); 
    newsViewHolder.title.setText(news.get(i).title); 
    newsViewHolder.today.setText(news.get(i).today); 
} 

@Override 
public int getItemCount() { 
    if (news != null) { 
     return news.size(); 
    } 
    return 0; 
} 
} 

RVDetailAdapter:

public class RVDetailAdapter extends RecyclerView.Adapter<RVDetailAdapter.DetailViewHolder> { 


public static class DetailViewHolder extends RecyclerView.ViewHolder { 
    TextView link; 

    public DetailViewHolder(View itemView) { 
     super(itemView); 

     link = (TextView) itemView.findViewById(R.id.link); 
    } 
} 

List<Detail> detail; 

RVDetailAdapter(List<Detail> detail) { 
    this.detail = detail; 
} 

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

@Override 
public RVDetailAdapter.DetailViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.itemnewsfeed, viewGroup, false); 
    DetailViewHolder dvh = new DetailViewHolder(v); 
    return dvh; 
} 

@Override 
public void onBindViewHolder(DetailViewHolder detailViewHolder, int i) { 
    detailViewHolder.link.setText(detail.get(i).link); 

} 

@Override 
public int getItemCount() { 
    if (detail != null) { 
     return detail.size(); 
    } 
    return 0; 
} 
} 

Antwort

0

Nicht sicher, ob Sie immer noch nach einer Antwort suchen, aber ich sah nur den Pfosten und dachte, ich würde dir eine Option geben.

Wenn ich eine RecyclerView verwende (egal, ob CardView verwendet wird oder nicht, ist es für jedes Listenelement identisch), erzeuge ich einen Klick-Listener für das Ansichtselement im Adapter. Wenn der Benutzer auf das Element/die Kartenansicht klickt, zitiere ich ein Elementklickereignis. Sie haben die Wahl, wie Sie antworten - Sie können eine Standard-Callback-Schnittstelle verwenden (und Ihren Listener bei der Erstellung des Adapters übergeben) oder etwas wie EventBus verwenden.

Hier ist ein Beispiel für den Code, den Sie auf Ihre Adapter-Klasse hinzufügen würde:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false); 

    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      itemClick(view); 
     } 
    }); 

    return new ViewHolder(view); 
} 

private void itemClick(View view) { 
    //Handle item event here 
    //EventBus.getDefault().post(new ItemSelectedEvent(/*send apprpopriate data*/)); 
}