8

Ich habe eine Frage zu geklickt cardview Daten zur Aktivität vorbei, und hier die ganze Geschichte:Passing RecyclerView CardView Clicked Artikeldaten Aktivität

  1. Ich habe eine Aktivität „Details“ genannt, die in 2 Textviews enthält Es ist Layout, Titel & Beschreibung.

  2. Ich habe ein Fragment (tab_1) eingerichtet, das die RecyclerView Codes und die Items enthält. Jedes Item enthält: title & Beschreibung.

, was ich will:

Wenn der Benutzer das Element klicken, wird es die Details der Aktivität öffnen und Einzelheiten Layout Titel ändern, mit klickten Artikel Titel, und das gleiche für die Beschreibung.

Ich habe die andere Aktivität als Beispiel erstellt und die Absicht, es zu starten, plus "AddOnTouchlistener" dank Stackoverflow, ich habe den Weg gefunden, es zu machen.

Also, wie man das lebendig machen? Ich habe viele Möglichkeiten der verfügbaren Antworten auf Stackoverflow ausprobiert, aber alle funktionieren nicht oder nicht im Zusammenhang mit meiner Anfrage.

Hier sind meine Dateien:

itemsdata.java:

public class itemsdata { 
int CatPic; 
String title; 
String Descr; 
int Exapnd; 
int expand_no; 

tab_1.java (Fragment)

public class tab_1 extends Fragment implements SearchView.OnQueryTextListener { 

private RecyclerView mRecyclerView; 
public RecyclingViewAdapter adapter; 
private Activity context; 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View layout = inflater.inflate(R.layout.tab_1, container, false); 
    mRecyclerView = (RecyclerView)layout.findViewById(R.id.recycler_view); 
    mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener 
      (getContext(), new RecyclerItemClickListener.OnItemClickListener() { 

       @Override 
       public void onItemClick(View view, int position) { 
        Intent i = new Intent(view.getContext(), DetailsActivity.class); 
        view.getContext().startActivity(i); 
       } 
      })); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    adapter = new RecyclingViewAdapter(getActivity(),Listed()); 
    mRecyclerView.setAdapter(adapter); 
    return layout; 

} 


@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.main, menu); 

    final MenuItem item = menu.findItem(R.id.action_search); 
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); 
    searchView.setOnQueryTextListener(this); 
} 

@Override 
public boolean onQueryTextChange(String query) { 
    final List<itemsdata> filteredModelList = filter(Listed(), query); 
    adapter.animateTo(filteredModelList); 
    mRecyclerView.scrollToPosition(0); 
    return true; 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

private List<itemsdata> filter(List<itemsdata> models, String query) { 
    query = query.toLowerCase(); 

    final List<itemsdata> filteredModelList = new ArrayList<>(); 
    for (itemsdata model : models) { 
     final String text = model.title.toLowerCase(); 
     if (text.contains(query)) { 
      filteredModelList.add(model); 
     } 
    } 
    return filteredModelList; 
} 

public List<itemsdata> Listed() 
{ 
    //Titles Strings 
    String sys_title1 = getString(R.string.system_item_title_1); 
    String sys_title2 = getString(R.string.system_item_title_2); 
    String sys_title3 = getString(R.string.system_item_title_3); 

    //Description Strings 
    String sys_descr1 = getString(R.string.system_item_desc_1); 
    String sys_descr2 = getString(R.string.system_item_desc_2); 
    String sys_descr3 = getString(R.string.system_item_desc_3); 

    //Adding New Cards 
    List<itemsdata> data = new ArrayList<>(); 

    //Categories Icons New Items ** Make It The Same 
    int[] icons = { 
      R.drawable.facebook_icon , 
      R.drawable.twitter_icon , 
      R.drawable.twitter_icon 
    }; 

    //Expand Button New Items 
    int[] expandbutton = { 
      R.drawable.expanded , 
      R.drawable.expanded , 
      R.drawable.expanded 
    }; 

    //UnExpand Button New Items 
    int[] unexpandbutton = { 
      R.drawable.ca_expand , 
      R.drawable.ca_expand , 
      R.drawable.ca_expand 
    }; 

    //Titles New Items 
    String[] titles = { 
      sys_title1 , 
      sys_title2 , 
      sys_title3 
    }; 

    //Description New Items 
    String[] Description = { 
      sys_descr1 , 
      sys_descr2 , 
      sys_descr3 
    }; 


    for(int i = 0;i<titles.length && i < icons.length && i < Description.length && i < unexpandbutton.length && i < expandbutton.length ; i++) 
    { 
     itemsdata current = new itemsdata(); 
     current.CatPic = icons[i]; 
     current.title = titles[i]; 
     current.Descr = Description[i]; 
     current.expand_no = unexpandbutton[i]; 
     current.Exapnd = expandbutton[i]; 
     data.add(current); 
    } 
    return data; 
} 

} 

Details zur Aktivität:

public class DetailsActivity extends AppCompatActivity{ 

TextView title; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.details); 
    title = (TextView)findViewById(R.id.details_title); 
} 

EDIT: I hab es geschafft, ich habe ein hinzugefügt Button, die das Fragment öffnen, und die Daten im Adapter übergeben, aber ich will es über tab_1.java, nicht den Adapter, ich meine, ich möchte auf das Element klicken, um das Fragment zu öffnen, nicht auf eine Schaltfläche, hier ein Kinderspiel von meinem Adapter Code (ich habe es in OnBindViewHolder hinzugefügt)

Ich habe ein OnClick eingerichtet und implementiert die Vew.setOnClick .. etc, aber wenn ich auf das Element klicken, passiert nichts.

@Override 
public void onBindViewHolder(final MyRecycleViewHolder holder, int position) { 

    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(v.getContext(),DetailsActivity.class); 
      v.getContext().startActivity(i); 
     } 
    }); 

    //Referencing Data 
    final itemsdata currentobject = mdata.get(position); 
    //Referencing Items 
    holder.ProbTitle.setText(currentobject.title); 
    holder.ProbDescr.setText(currentobject.Descr); 
    holder.CategoryPic.setImageResource(currentobject.CatPic); 
    holder.ExpandButton.setImageResource(currentobject.Exapnd); 
    holder.ExpandNoButton.setImageResource(currentobject.expand_no); 
     //What Happen When You Click Expand Button . 
    holder.ExpandButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(v.getContext(), DetailsActivity.class); 
      i.putExtra("TitleKey",holder.ProbTitle.getText().toString()); 
      v.getContext().startActivity(i); 
      } 
     } 
    ); 

public static class MyRecycleViewHolder extends RecyclerView.ViewHolder 
{ 



    SwipeLayout swipeLayout; 
    //Defining Items . 
    TextView ProbTitle; 
    ImageButton ExpandButton; 
    TextView ProbDescr; 
    ImageButton ExpandNoButton; 
    ImageView CategoryPic; 
    /* 
    TextView Card_Star; 
    TextView Card_UnStar; 
    */ 
    TextView Card_Share; 

    //Referencing Resources 
    public MyRecycleViewHolder(final View itemView) { 
     super(itemView); 
     ProbTitle = (TextView) itemView.findViewById(R.id.prob_title); 
     CategoryPic = (ImageView) itemView.findViewById(R.id.cat_pic); 
     ProbDescr = (TextView) itemView.findViewById(R.id.prob_descr); 
     ExpandButton = (ImageButton) itemView.findViewById(R.id.expand_button); 
     ExpandNoButton = (ImageButton) itemView.findViewById(R.id.expand_no_button); 
     /* 
     Card_Star = (TextView) itemView.findViewById(R.id.card_star); 
     Card_UnStar = (TextView) itemView.findViewById(R.id.card_unstar); 
     */ 
     Card_Share = (TextView) itemView.findViewById(R.id.card_share); 
     swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe); 

    } 

Antwort

1

Sie versuchen, diese auf Ihrem onItemClick tun kann()

Intent i = new Intent(view.getContext(), DetailsActivity.class); i.putExtra("title", yourTitle); i.putExtra("description", yourDescription); view.getContext().startActivity(i);

und wenn oncreate in Ihrem DetailActivity, tun dies

String title = getIntent().getStringExtra("title"); String description = getIntent().getStringExtra("description");

so können Sie Titel übergeben und Beschreibung zu DetailActivity

+0

Bitte überprüfen Sie die bearbeiten, Ihre Art und Weise gewonnen 't arbeiten, das Problem, diese Zeichenfolge zu bekommen, nur mögliche Weg ist vom Adapter, aber von der Tab_1.java, ist es nicht möglich. – Jaeger

+0

@AboHani RecyclerView stellt onItemClickListener und onItemLongClickListener nicht zur Verfügung, Sie sollten es nur im Adapter setzen ... oder Sie können eine Schnittstelle im Adapter erstellen wie diese öffentliche Schnittstelle OnItemClickLitener { void onItemClick (View anzeigen, int position); void onItemLongClick (Ansicht anzeigen, int-Position); } 'und rufen Sie sie auf, wenn Sie auf einen beliebigen Punkt geklickt oder lange geklickt haben, so dass Sie jetzt einen Listener in tab_1.java festlegen können. – chichiangho

+0

Ja, ich habe auf diese Weise zuerst hinzugefügt, aber ich war nicht in der Lage, die Daten zu übergeben, jedenfalls habe ich es über den Verweis cardview im Adapter und die Weitergabe der Daten mit intent.putExtras gemacht. BTW, wenn Sie wissen in Searchview überprüfen Sie bitte meine Frage in meinem Profil, und danke für Ihre Antwort :). – Jaeger

0

IMO, Sie implementieren setOnClickListener innerhalb Adapter von RecyclerView. Sie können auf meinen folgenden Beispielcode verweisen und dann seine Logik auf Ihren Code anwenden. Ich hoffe es hilft!

public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.ViewHolder> { 

    Context mContext; 
    List<String> mStringList; 

    public MyRVAdapter(Context mContext, List<String> mStringList) { 
     this.mContext = mContext; 
     this.mStringList = mStringList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false); 
     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       TextView textView1 = (TextView) v.findViewById(R.id.textView1); 
       TextView textView2 = (TextView) v.findViewById(R.id.textView2); 
       Bundle bundle = new Bundle(); 
       bundle.putString("key1", textView1.getText().toString()); 
       bundle.putString("key2", textView2.getText().toString()); 

       passToAnotherActivity(bundle); 
      } 
     }); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // do something... 
    } 

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

    private void passToAnotherActivity(Bundle bundle) { 
     if (mContext == null) 
      return; 
     if (mContext instanceof MainActivity) { 
      MainActivity activity = (MainActivity) mContext; 
      activity.passToAnotherActivity(bundle); // this method must be implemented inside `MainActivity` 
     } 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     public ViewHolder(View itemView) { 
      super(itemView); 
      // do something... 
     } 

     @Override 
     public void onClick(View v) { 
     } 
    } 
} 
1

Zuerst machen Sie Ihr "itemsdata" -Objekt, um Parcelable zu implementieren.Sie können es überprüfen here. In Ihrer onItemClick-Methode übergeben Sie das Objekt mithilfe von intent.putExtra an Ihre Details-Aktivität ("key", listOfDataItems.get (position)); In Ihrer DetailsActivity können Sie Ihr benutzerdefiniertes Objekt mit getParcelable ("Schlüssel") erhalten

2

Erstellen Sie eine in Ihrem Adapter mit methods. Und während Sie Ihren Adapter implementieren, werden diese Methoden in Ihrer Aktivität implementiert und Sie können jede gewünschte Aktion ausführen.

public class Adapter extends RecyclerView.Adapter<MyRecycleViewHolder> { 

    public interface Callbacks { 
     public void onButtonClicked(String titleKey); 
    } 

    private Callbacks mCallbacks; 

    public Adapter() { 

    } 

    @Override 
    public MyRecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_details, null); 
     return new MyRecycleViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(final MyRecycleViewHolder holder, final int i) { 

     holder.ExpandButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mCallbacks != null) { 
        mCallbacks.onButtonClicked(holder.ProbTitle.getText().toString()); 
       } 
      } 
     }); 

    } 


    @Override 
    public int getItemCount() { 
     return; 
    } 

    public void setCallbacks(Callbacks callbacks) { 
     this.mCallbacks = callbacks; 
    } 
} 
1

Alle obigen Methoden gearbeitet, aber irgendwie lang, so dass diese ein für mich gearbeitet:

Cardview cardview; 
      cardView = (CardView)itemView.findViewById(R.id.cv); 

     cardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i = new Intent (view.getContext(), DetailsActivity.class); 
       i.putExtra("TitleKey",ProbTitle.getText().toString()); 
       i.putExtra("DescrKey",ProbDescr.getText().toString()); 
       view.getContext().startActivity(i); 
      } 
     }); 

Und in Details.java:

TextView title; 
TextView Descr; 
     title = (TextView)findViewById(R.id.details_title); 
    Descr = (TextView)findViewById(R.id.details_descr); 

    String titleresult = result.getExtras().getString("TitleKey"); 
    String Descrresult = result.getExtras().getString("DescrKey"); 

    title.setText(titleresult); 
    Descr.setText(Descrresult); 
+0

Wenn jemand nicht verstanden hat, war mein Problem in der Übergabe der angeklickt Titel, so dass dies für mich arbeitete, vielen Dank für Ihre Antworten . – Jaeger

+1

Was ist "Ergebnis" über das, das Sie mit getExtras() verwenden. GetString()? – AJW

+0

Wird es mit "Intent result = getIntent()" verwendet? – AJW

Verwandte Themen