2017-08-07 70 views
1

我一直在嘗試將從RecyclerView單擊的項目位置發送給Fragment父親,我已經看到很多教程,但是我沒有成功完成此任務。請幫我在這特定的情況下:通過商品位置點擊從RecyclerView到片段父親

這是我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; 
} 
+0

你recycleview是其他片段裏面? –

+0

@BrunoFerreira不,RecyclerView位於FragmentArchivos片段內。 – JosCarrillo

+0

好的我現在明白了 –

回答

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

謝謝大家,這一款適合我!謝謝 – JosCarrillo

0

你可以嘗試做到這一點的方式。

首先創建吶接口這樣的命名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) {} 

    } 

} 
0

的ListView具有setOnItemClickListener( )方法,但RecyclerView沒有。下面的鏈接是你的解決方案:

Why doesn't RecyclerView have onItemClickListener()?

編輯:如果你想從你的活動調用此功能,你需要的東西象下面這樣:

首先,在您的活動添加一個方法(有此RecyclerView )與適當的參數。其次,你可以將你的上下文變量轉換爲你的活動。投它並調用你的方法。現在您的活動有一個監聽器,用於點擊哪個項目。

相關問題