[英]Pass Object from one fragment to another fragment when recyclerView item is clicked
[英]Pass Item Position Clicked from a RecyclerView to the Fragment father
我一直在嘗試將從RecyclerView
單擊的項目位置發送給Fragment
父親,我已經看過許多教程,但是我做不到這一點。 請在這種情況下幫助我:
這是我的Adapter
類:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private static final int TYPE_FOOTER = 2;
private HeaderViewHolder headerHolder;
private ArrayList<Doc> documentos;
private Context context;
private ArrayAdapter<String> arrayAdapter;
private SQLiteHandler db;
public MyAdapter(Context context, ArrayList<Doc> generics) {
this.context = context;
this.documentos = generics;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_header, parent, false);
return new HeaderViewHolder (v);
} else if(viewType == TYPE_FOOTER) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_foter, parent, false);
return new FooterViewHolder (v);
} else if(viewType == TYPE_ITEM) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_item, parent, false);
return new GenericViewHolder (v);
}
return null;
}
private Doc getItem (int position) {
return documentos.get (position);
}
@Override
public void onBindViewHolder (RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof HeaderViewHolder) {
headerHolder = (HeaderViewHolder) holder;
headerHolder.card_view_header.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
createDialogServices();
}
});
} else if(holder instanceof FooterViewHolder) {
FooterViewHolder footerHolder = (FooterViewHolder) holder;
//footerHolder.txtTitleFooter.setText ("Footer");
footerHolder.send_Button.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
Toast.makeText (context, "Enviando documentos...", Toast.LENGTH_SHORT).show ();
}
});
} else if(holder instanceof GenericViewHolder) {
Doc currentItem = getItem (position - 1);
final Integer num = currentItem.getPosition();
GenericViewHolder genericViewHolder = (GenericViewHolder) holder;
genericViewHolder.txtTitle.setText(currentItem.getTittle());
genericViewHolder.txtDescription.setText(currentItem.getDescription());
genericViewHolder.txtTitle.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
ImagePicker.pickImage((Activity) context, "Select your image:");
}
});
}
}
@Override
public int getItemViewType (int position) {
if(isPositionHeader (position)) {
return TYPE_HEADER;
} else if(isPositionFooter (position)) {
return TYPE_FOOTER;
}
return TYPE_ITEM;
}
private boolean isPositionHeader (int position) {
return position == 0;
}
private boolean isPositionFooter (int position) {
return position == documentos.size () + 1;
}
@Override
public int getItemCount () {
return documentos.size () + 2;
}
private class FooterViewHolder extends RecyclerView.ViewHolder {
Button send_Button;
FooterViewHolder(View itemView) {
super (itemView);
this.send_Button = (Button) itemView.findViewById (R.id.btn_send_docs);
}
}
private class HeaderViewHolder extends RecyclerView.ViewHolder {
CardView card_view_header;
TextView card_txt_title;
TextView card_txt_description;
HeaderViewHolder(View itemView) {
super (itemView);
this.card_view_header = (CardView) itemView.findViewById (R.id.card_view_header);
this.card_txt_title = (TextView) itemView.findViewById(R.id.card_header_textView_tittle);
this.card_txt_description = (TextView) itemView.findViewById(R.id.card_header_textView_description);
}
}
private class GenericViewHolder extends RecyclerView.ViewHolder {
TextView txtTitle;
TextView txtDescription;
GenericViewHolder(View itemView) {
super(itemView);
this.txtTitle = (TextView) itemView.findViewById(R.id.card_item_textView_tittle);
this.txtDescription = (TextView) itemView.findViewById(R.id.card_item_textView_description);
}
}
這是我的Fragment
類:
public class FragmentArchivos extends Fragment {
private RecyclerView.Adapter MyAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView rv;
private Button btn_send_fr_docs;
private Bitmap bitmap;
private ImageView photo;
private SQLiteHandler db;
private Integer x;
public FragmentArchivos(){
//Empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View myView = inflater.inflate(R.layout.fr_docs, container, false);
db = new SQLiteHandler(getActivity());
getAllDocsFromServer();
x = db.getDocsCount();
RecyclerView recyclerView = (RecyclerView) myView.findViewById (R.id.cardList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager (getActivity());
MyAdapter adapter = new MyAdapter(getActivity(), getDocumentList());
recyclerView.setLayoutManager (linearLayoutManager);
recyclerView.setAdapter (adapter);
return myView;
}
您可以嘗試這樣做。
首先創建一個名為RecyclerViewOnClickListenerHack
接口:
public interface RecyclerViewOnClickListenerHack {
public void onClickListener(View view, int position);
public void onLongPressClickListener(View view, int position);
}
然后分段執行此操作:
1)實現RecyclerViewOnClickListenerHack;
2)添加方法;
3)然后在Onclick方法內部,您有一個參數位置。 方法是這樣的:
@Override
public void onClickListener(View view, int position) {
}
4)最后,將其添加到oncreateview()方法內的recycleview中:
recyclerViewtodas.addOnItemTouchListener(new RecyclerViewTouchListener(getActivity(), your_recycleview, this));
因此,完整的代碼應如下所示:
public class separadortodas extends Fragment implements RecyclerViewOnClickListenerHack {
...
@Override
public void onClickListener(View view, int position) {
}
@Override
public void onLongPressClickListener(View view, int position) {
}
private static class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener {
private Context mContext;
private GestureDetector mGestureDetector;
private RecyclerViewOnClickListenerHack mRecyclerViewOnClickListenerHack;
RecyclerViewTouchListener(Context c, final RecyclerView rv, RecyclerViewOnClickListenerHack rvoclh){
mContext = c;
mRecyclerViewOnClickListenerHack = rvoclh;
mGestureDetector = new GestureDetector(mContext, new GestureDetector.SimpleOnGestureListener(){
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return(true);
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean b) {}
}
}
ListView具有setOnItemClickListener()方法,但RecyclerView沒有。 以下鏈接是您的解決方案:
為什么RecyclerView沒有onItemClickListener()?
編輯:如果要從活動中調用此功能,則需要類似以下的內容:
首先在您的活動(具有此RecyclerView)中添加帶有適當參數的方法。 其次,您可以將上下文變量轉換為活動。 強制轉換並調用您的方法。 現在,您的活動有了一個監聽器,單擊了該條目。
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private static final int TYPE_FOOTER = 2;
private HeaderViewHolder headerHolder;
private ArrayList<Doc> documentos;
private Context context;
private ArrayAdapter<String> arrayAdapter;
private SQLiteHandler db;
MyClickListener myClickListener;
public MyAdapter(Context context, ArrayList<Doc> generics, MyClickListener myClickListener) {
this.context = context;
this.documentos = generics;
this. myClickListener = myClickListener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_header, parent, false);
return new HeaderViewHolder (v);
} else if(viewType == TYPE_FOOTER) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_foter, parent, false);
return new FooterViewHolder (v);
} else if(viewType == TYPE_ITEM) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.card_item, parent, false);
return new GenericViewHolder (v);
}
return null;
}
private Doc getItem (int position) {
return documentos.get (position);
}
@Override
public void onBindViewHolder (RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof HeaderViewHolder) {
headerHolder = (HeaderViewHolder) holder;
headerHolder.card_view_header.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
myClickListener.onItemClick(getAdapterPosition())
createDialogServices();
}
});
} else if(holder instanceof FooterViewHolder) {
FooterViewHolder footerHolder = (FooterViewHolder) holder;
//footerHolder.txtTitleFooter.setText ("Footer");
footerHolder.send_Button.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
myClickListener.onItemClick(getAdapterPosition())
Toast.makeText (context, "Enviando documentos...", Toast.LENGTH_SHORT).show ();
}
});
} else if(holder instanceof GenericViewHolder) {
Doc currentItem = getItem (position - 1);
final Integer num = currentItem.getPosition();
GenericViewHolder genericViewHolder = (GenericViewHolder) holder;
genericViewHolder.txtTitle.setText(currentItem.getTittle());
genericViewHolder.txtDescription.setText(currentItem.getDescription());
genericViewHolder.txtTitle.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick (View view) {
myClickListener.onItemClick(getAdapterPosition())
ImagePicker.pickImage((Activity) context, "Select your image:");
}
});
}
}
@Override
public int getItemViewType (int position) {
if(isPositionHeader (position)) {
return TYPE_HEADER;
} else if(isPositionFooter (position)) {
return TYPE_FOOTER;
}
return TYPE_ITEM;
}
private boolean isPositionHeader (int position) {
return position == 0;
}
private boolean isPositionFooter (int position) {
return position == documentos.size () + 1;
}
@Override
public int getItemCount () {
return documentos.size () + 2;
}
private class FooterViewHolder extends RecyclerView.ViewHolder {
Button send_Button;
FooterViewHolder(View itemView) {
super (itemView);
this.send_Button = (Button) itemView.findViewById (R.id.btn_send_docs);
}
}
private class HeaderViewHolder extends RecyclerView.ViewHolder {
CardView card_view_header;
TextView card_txt_title;
TextView card_txt_description;
HeaderViewHolder(View itemView) {
super (itemView);
this.card_view_header = (CardView) itemView.findViewById (R.id.card_view_header);
this.card_txt_title = (TextView) itemView.findViewById(R.id.card_header_textView_tittle);
this.card_txt_description = (TextView) itemView.findViewById(R.id.card_header_textView_description);
}
}
private class GenericViewHolder extends RecyclerView.ViewHolder {
TextView txtTitle;
TextView txtDescription;
GenericViewHolder(View itemView) {
super(itemView);
this.txtTitle = (TextView) itemView.findViewById(R.id.card_item_textView_tittle);
this.txtDescription = (TextView) itemView.findViewById(R.id.card_item_textView_description);
}
public interface MyClickListener {
public void onItemClicked(int position);
}
}
在FragmentArchivos類中
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View myView = inflater.inflate(R.layout.fr_docs, container, false);
db = new SQLiteHandler(getActivity());
getAllDocsFromServer();
x = db.getDocsCount();
RecyclerView recyclerView = (RecyclerView) myView.findViewById (R.id.cardList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager (getActivity());
MyAdapter adapter = new MyAdapter(getActivity(), getDocumentList(), new MyClickListener(){
@Override
public void onItemClick(int position) {
//TODO do ur work here
}
});
recyclerView.setLayoutManager (linearLayoutManager);
recyclerView.setAdapter (adapter);
return myView;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.