簡體   English   中英

將從RecyclerView單擊的項目位置傳遞給Fragment父親

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM