8

У меня есть вопрос о прохождении кликали данные cardview к активности, а вот полная история:Передачи RecyclerView CardView Clicked элемент данных Активности

  1. У меня есть активность под названием «Деталь», который содержит 2 TextViews в его макет, название & Описание.

  2. У меня есть фрагмент (tab_1), который содержит коды recyclerview и данные элементов, каждый элемент которых содержит: заголовок &.

Что я хочу:

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

У меня возникла необходимость создать в качестве примера другую деятельность, и я попытался ее запустить, добавив «addOnTouchlistener» благодаря Stackoverflow, я нашел способ сделать это.

Итак, как это сделать? Я пробовал много способов доступных ответов на Stackoverflow, но все они не работают или не связаны с моим запросом.

Вот мои файлы:

itemsdata.java:

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

tab_1.java (фрагмент)

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

} 

Детали Активность:

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: Я Я сделал это, я добавил который открывает фрагмент и передает данные в Адаптере, но я хочу его через tab_1.java, а не Адаптер, я имею в виду, что хочу нажимать на элемент, чтобы открыть фрагмент, а не на кнопке, здесь из моего кода адаптера (я добавил его в OnBindViewHolder)

Я установил OnClick и внедрил Vew.setOnClick ..etc, но когда я нажимаю элемент, ничего не происходит.

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

    } 

ответ

1

вы можете попробовать сделать это на onItemClick()

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

и когда OnCreate в вашем DetailActivity, сделать это

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

, так что вы можете передать титул и описание к DetailActivity

+0

Пожалуйста, проверьте редактировать свой путь выиграл Не работает, проблема в получении этой строки, возможен только путь от адаптера, но из tab_1.java это невозможно. – Jaeger

+0

@AboHani RecyclerView не предоставляет onItemClickListener и onItemLongClickListener, вы должны установить его только в адаптере ... или вы можете создать интерфейс в адаптере, например, этот открытый интерфейс OnItemClickLitener { void onItemClick (View view, int position); void onItemLongClick (View view, int position); } 'и назовите его, когда каждый элемент щелкнул или долго нажал, чтобы вы могли теперь установить слушателя в tab_1.java. – chichiangho

+0

Да, я добавил сначала таким образом, но я не смог передать данные, так или иначе, я сделал это с помощью ссылки на картографию в адаптере и передачи данных с помощью aim.putExtras. Кстати, если у вас есть знания в поиске, пожалуйста, проверьте мой вопрос в моем профиле и спасибо за ваш ответ :). – Jaeger

0

ИМО, вы реализуете setOnClickListener внутри Adapter от RecyclerView. Вы можете ссылаться на мой следующий пример кода, а затем применить его логику к вашему коду. Надеюсь, поможет!

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

Прежде всего, создайте объект «itemsdata» для реализации Parcelable.Вы можете проверить его here. В вашем методе onItemClick вы передаете объект в свою активность с помощью aim.putExtra («key», listOfDataItems.get (position)); В вашей подробной информации вы можете получить свой пользовательский объект с getParcelable («ключ»)

2

создать Interface внутри вашего адаптера, содержащего methods. И при реализации вашего адаптера эти методы будут реализованы в вашей деятельности, и вы сможете выполнить любое действие, которое вы хотите.

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

Все эти методы работали, но своего рода долго, так что это один работал для меня:

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

И в 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

, если кто-то не понял, моя проблема заключалась в передаче заголовка элемента с щелчком, поэтому это сработало для меня, спасибо за ваши ответы , – Jaeger

+1

Что такое «результат», который вы используете с getExtras(). GetString()? – AJW

+0

Используется ли он с "Intent result = getIntent()"? – AJW

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