同时处理Recyclerview和CardView的点击事件

时间:2017-07-07 04:23:21

标签: java android android-recyclerview android-cardview

我需要创建嵌套的recyclerView,如

RecyclerView Contains-> CardView contains-> RecyclerView

如果我点击卡片我只能获得儿童位置,但我也需要父卡位置。如何同时处理Recyclerview和CardView的点击事件?

MainActivity.java:

public class MainActivity extends Activity {
LinearLayout linView;
private RecyclerView main_view;
RootAdapter adapter2;
private RelativeLayout mRelativeLayout;
private Context mContext;
private Activity mActivity;

int pos = 0;
int main_pos;

private static RecyclerView.Adapter adapter;
private static RecyclerView.Adapter adapterCo;
private RecyclerView.LayoutManager layoutManager;
private static ArrayList<DataModelMain> dataMain;
private static ArrayList<DataModel_CO> dataCo;
static View.OnClickListener myOnClickListener;
static View.OnClickListener onClickListener;
private static ArrayList<Integer> removedItems;
TestMain mainData = new TestMain();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    prof = (ImageView) findViewById(R.id.profile);

    main_view = (RecyclerView) findViewById(R.id.recycler_main);

    mRelativeLayout = (RelativeLayout) findViewById(R.id.partners);
    cont = (TextView) findViewById(R.id.mobile);
    iconType = (ImageView) findViewById(R.id.icon_type);
    linView = (LinearLayout) findViewById(R.id.layout_view);

    // Get the application context
    mContext = getApplicationContext();
    // Get the activity
    mActivity = MainActivity.this;

    myOnClickListener = new MyOnClickListener(this);
    onClickListener = new OnClickListener(this);

    main_view.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(
            this,
            LinearLayoutManager.VERTICAL,
            false
    ) {


    };

    main_view.setLayoutManager(layoutManager);
    main_view.setItemAnimator(new DefaultItemAnimator());
    dataMain = new ArrayList<DataModelMain>();

    getMainData();
    setMainView();
}
}

private void getMainData() {

    for (int i = 0; i < mainData.passengers.length; i++) {
        dataMain.add(new DataModelMain(
                mainData.type[i],
                mainData.passengers[i],
                mainData.p_name[i],
                mainData.p_contact[i],
                mainData.p_flight[i],
                mainData.p_pnr[i],
                mainData.air[i],
                mainData.p_time[i]
        ));
    }

    adapter2 = new RootAdapter(this, dataMain);
    main_view.setAdapter(adapter2);
}


private class MyOnClickListener implements View.OnClickListener {

    private final Context context;

    private MyOnClickListener(Context context) {
        this.context = context;
    }

    @Override
    public void onClick(View v) {
        showIcons(v);
    }

    private void showIcons(View v) {
        pos = main_view.getChildPosition(v);
        setMainView();

    }

}
private class OnClickListener implements View.OnClickListener {

    private final Context context1;

    private OnClickListener(Context context0) {
        this.context1 = context0;
    }

    @Override
    public void onClick(View v) {
        showIcons(v);
    }

    private void showIcons(View v) {
        pos = main_view.getChildPosition(v);
        Log.e("CLICKED","pos: "+pos);

    }

}


private class RootAdapter extends RecyclerView.Adapter<RootAdapter.RootViewHolder> {

    private final LayoutInflater inflater;
    String[] _items = new String[]{"GROUP 1", "GROUP 2", "GROUP 3", "GROUP 4"};
    private ArrayList<DataModelMain> dataSet;
    public RootAdapter(Context context,ArrayList<DataModelMain> data) {
        inflater = LayoutInflater.from(context);
        this.dataSet = data;
    }

    @Override
    public RootViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = inflater.inflate(R.layout.card_main, viewGroup, false);
        RootViewHolder rvi = new RootViewHolder(view);
        view.setOnClickListener(MainActivity.onClickListener);
        return rvi;
    }

    @Override
    public void onBindViewHolder(RootViewHolder rootViewHolder, int i) {

        rootViewHolder.recyclerViewChild.setLayoutManager(new LinearLayoutManager(inflater.getContext()));
        rootViewHolder.recyclerViewChild.setAdapter(new ChildAdapter(inflater,dataSet));
    }

    @Override
    public int getItemCount() {
        return _items.length;
    }

    class RootViewHolder extends RecyclerView.ViewHolder {

        RecyclerView recyclerViewChild;

        public RootViewHolder(View itemView) {
            super(itemView);
            recyclerViewChild = (RecyclerView) itemView.findViewById(R.id.recycler_partners);

        }
    }
}


private class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ChildViewHolder> {
    private LayoutInflater _inflater;

    private ArrayList<DataModelMain> dataSet;


    public ChildAdapter(LayoutInflater inflater,ArrayList<DataModelMain> data) {
        _inflater = inflater;
        this.dataSet = data;
    }

    @Override
    public ChildViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = _inflater.inflate(R.layout.card_partner, viewGroup, false);
        ChildViewHolder rvi = new ChildViewHolder(view);
        view.setOnClickListener(MainActivity.myOnClickListener);
        return rvi;
    }

    @Override
    public void onBindViewHolder(ChildViewHolder holder, int listPosition) {
        TextView name = holder.tvName;
        TextView cont = holder.tvCont;
        TextView flight = holder.tvFlight;
        TextView pnr = holder.tvPNR;
        TextView time = holder.tvTime;
        ImageView type = holder.im_type;
        ImageView pic = holder.im_pic;
        ImageView logo = holder.im_logo;
        CardView cardView = holder.card;

        name.setText(dataSet.get(listPosition).getName());
        cont.setText(dataSet.get(listPosition).getContact());
        flight.setText(dataSet.get(listPosition).getFlight());
        pnr.setText(dataSet.get(listPosition).getPnr());
        time.setText(dataSet.get(listPosition).getTime());
        type.setImageResource(dataSet.get(listPosition).getType());
        pic.setImageResource(dataSet.get(listPosition).getImage());
        logo.setImageResource(dataSet.get(listPosition).getLogo());

        switch (dataSet.get(listPosition).getType()){

            case R.mipmap.gov:
                cardView.setCardBackgroundColor(Color.parseColor("#FAFAD2"));
                break;
            case R.mipmap.vip:
                cardView.setCardBackgroundColor(Color.parseColor("#CDFFCD"));
                break;
            case R.mipmap.jail:
                cardView.setCardBackgroundColor(Color.parseColor("#FFE4E1"));
                break;
            case R.mipmap.ban:
                cardView.setCardBackgroundColor(Color.parseColor("#DCDCDC"));
                break;

        }
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    }

    public class ChildViewHolder extends RecyclerView.ViewHolder {

        ImageView im_type,im_pic,im_logo;
        TextView tvName,tvCont,tvFlight,tvPNR,tvTime;
        CardView card;

        public ChildViewHolder(View itemView) {
            super(itemView);
            this.card = (CardView) itemView.findViewById(R.id.card_view);
            this.im_type = (ImageView) itemView.findViewById(R.id.p_type);
            this.im_pic = (ImageView) itemView.findViewById(R.id.p_profile);
            this.im_logo = (ImageView) itemView.findViewById(R.id.p_air_lines);
            this.tvName = (TextView) itemView.findViewById(R.id.p_name);
            this.tvCont = (TextView) itemView.findViewById(R.id.p_mob);
            this.tvFlight = (TextView) itemView.findViewById(R.id.p_flight);
            this.tvPNR = (TextView) itemView.findViewById(R.id.p_pnr);
            this.tvTime = (TextView) itemView.findViewById(R.id.p_timer);
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

如何使root / parent cardView 可点击?

为父convertlerView的 cardView 项提供ID。将它放在ViewHolderClass中,然后将一个onCLickListener分配给BindViewHolder中的cardView,如下所示:

rootViewHolder.rootCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // keep an track of the selected position of the cardView and store it in a global/local variable
            }
        });

您可以使用

跟踪所选cardView的适配器位置
rootViewHolder.getAdapterPosition()

Note: rootViewHolder is written as per your ViewHolder class

我希望这会有所帮助!!