Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Recyclerview在Recyclerview中,获取父适配器中子行的单击位置_Java_Android_Android Recyclerview - Fatal编程技术网

Java Recyclerview在Recyclerview中,获取父适配器中子行的单击位置

Java Recyclerview在Recyclerview中,获取父适配器中子行的单击位置,java,android,android-recyclerview,Java,Android,Android Recyclerview,在我的项目要求是,因为有项目列表显示在活动中&我在列表中显示日期和价格,我想要的是用户将选择日期,日期颜色将改变,当点击购物车项目应添加到卡 问题:我无法在父recyclerViewonBindViewHolder中获取子recyclerView位置 是否有任何方法可以在父reyclerview中获取子行(日期行)的位置 下图显示了三个列表,每个列表中都有日期行列表。当用户点击特定日期时,我希望在onBindViewHolder内的父recyclerView适配器类上显示该日期 下面是适配器:

在我的项目要求是,因为有项目列表显示在活动中&我在列表中显示日期和价格,我想要的是用户将选择日期,日期颜色将改变,当点击购物车项目应添加到卡

问题:我无法在父recyclerView
onBindViewHolder中获取子recyclerView位置

是否有任何方法可以在父reyclerview中获取子行(日期行)的位置

下图显示了三个列表,每个列表中都有日期行列表。当用户点击特定日期时,我希望在onBindViewHolder内的父recyclerView适配器类上显示该日期

下面是适配器:

public interface RecyclerClickInterface {
void onClick(View view, int position);
}
holder.adapter = new CalenderAdapter(context, listCal, new RecyclerClickInterface() {
@Override
public void onClick(View view, int position) {
     Log.i(TAG, "position " + position);
    }
});
holder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    mRecyclerClickInterface.onClick(view, position);
   }
});
下面是父适配器类

FlowerListAdapter.java

public class FlowerListAdapter extends RecyclerView.Adapter<FlowerListAdapter.MyViewHolder>   {

    ArrayList<FlowerListPojo> list;
    Context context;

    public FlowerListAdapter(Context context, ArrayList<FlowerListPojo> list) {
        this.context = context;
        this.list = list;
    }

    //Pagination
    public void updateList(ArrayList<FlowerListPojo> list) {
        this.list.addAll(list);
        this.notifyDataSetChanged();
    }


    @Override
    public FlowerListAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.flower_list_row, viewGroup, false);
        return new FlowerListAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(FlowerListAdapter.MyViewHolder holder, int position) {

        LinearLayoutManager mLayoutManager;

        holder.name.setText(list.get(position).getInfo().getName());
        ArrayList<CalenderPojo> listCal = new ArrayList<>();
        Glide.with(context).load(list.get(position).getInfo().getImage())
                .thumbnail(0.5f)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.imageFlower);

        mLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
        holder.recyclerView.setLayoutManager(mLayoutManager);
        holder.recyclerView.setItemAnimator(new DefaultItemAnimator());

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        //todays date
        Date cToday = Calendar.getInstance().getTime();
        String todaysDate = df.format(cToday);
        //last day last next 90 days
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, 90);
        Date d = c.getTime();
        String lastDate = df.format(d);


        List<Date> dates = getDates(todaysDate, lastDate);
        for (Date date : dates) {

            String dayOfTheWeek = (String) DateFormat.format("EEE", date); // Thursday
            String day = (String) DateFormat.format("dd", date); // 20
            String monthString = (String) DateFormat.format("MMMM", date); // Jun
            String monthNumber = (String) DateFormat.format("MM", date); // 06
            String year = (String) DateFormat.format("yyyy", date); // 2013

            listCal.add(new CalenderPojo(dayOfTheWeek, day, "200", monthString + " " + year));
        }

        holder.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                int firstVisiblePosition = mLayoutManager.findFirstVisibleItemPosition();
                if(firstVisiblePosition>=0)
                holder.monthName.setText(listCal.get(firstVisiblePosition+3).getMonth());
            }
        });

        holder.recyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });



        //Date send to Adapter / Constructor call
        holder.adapter = new CalenderAdapter(context, listCal);
        holder.recyclerView.setAdapter(holder.adapter);
    }


    @Override
    public int getItemCount() {
        if (list.size() != 0)
            return list.size();
        else return 0;
    }


    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView name;
        ImageView imageFlower;
        RecyclerView recyclerView;
        TextView monthName;
        CalenderAdapter adapter;

        public MyViewHolder(View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.flowerNameFLR);
            imageFlower = itemView.findViewById(R.id.flowerImgFLR);
            recyclerView = itemView.findViewById(R.id.recycler_view_calender);
            monthName = itemView.findViewById(R.id.monthName);

        }



    }


    private static List<Date> getDates(String dateString1, String dateString2) {
        ArrayList<Date> dates = new ArrayList<Date>();
        java.text.DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

        Date date1 = null;
        Date date2 = null;

        try {
            date1 = df1.parse(dateString1);
            date2 = df1.parse(dateString2);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);


        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);

        while (!cal1.after(cal2)) {
            dates.add(cal1.getTime());
            cal1.add(Calendar.DATE, 1);
        }
        return dates;
    }
}
公共类FlowerListAdapter扩展了RecyclerView.Adapter{
数组列表;
语境;
公共FlowerListAdapter(上下文、ArrayList列表){
this.context=上下文;
this.list=列表;
}
//分页
公共无效更新列表(ArrayList列表){
this.list.addAll(list);
this.notifyDataSetChanged();
}
@凌驾
public FlowerListAdapter.MyViewHolder onCreateViewHolder(ViewGroup ViewGroup,int viewType){
View itemView=LayoutFlater.from(viewGroup.getContext())。充气(R.layout.flower\u list\u行,viewGroup,false);
返回新的FlowerListAdapter.MyViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(FlowerListAdapter.MyViewHolder,int位置){
直线布局经理mLayoutManager;
holder.name.setText(list.get(position.getInfo().getName());
ArrayList listCal=新的ArrayList();
Glide.with(context).load(list.get(position.getInfo().getImage())
.缩略图(0.5f)
.crossFade()
.diskCacheStrategy(diskCacheStrategy.ALL)
.插入(支架.图像花);
mLayoutManager=新的LinearLayoutManager(上下文,LinearLayoutManager.HORIZONTAL,false);
holder.recyclerView.setLayoutManager(MLLayoutManager);
holder.recyclerView.setItemAnimator(新的DefaultItemAnimator());
SimpleDataFormat df=新SimpleDataFormat(“yyyy-MM-dd”);
//今天的日期
Date=Calendar.getInstance().getTime();
字符串todaysDate=df.format(cToday);
//最后一天最后一个90天
Calendar c=Calendar.getInstance();
c、 添加(日历日期,90);
日期d=c.getTime();
字符串lastDate=df.format(d);
列表日期=getDates(todaysDate,lastDate);
用于(日期:日期){
String dayOfWeek=(String)DateFormat.format(“EEE”,date);//星期四
String day=(String)DateFormat.format(“dd”,date);//20
String monthString=(String)DateFormat.format(“MMMM”,date);//Jun
String monthNumber=(String)DateFormat.format(“MM”,date);//06
字符串年份=(字符串)日期格式。格式(“yyyy”,日期);//2013
添加(新日历POJO(星期一,天,“200”,月弦+“+年”);
}
holder.recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
int firstVisiblePosition=mLayoutManager.findFirstVisibleItemPosition();
如果(firstVisiblePosition>=0)
holder.monthName.setText(listCal.get(firstVisiblePosition+3.getMonth());
}
});
holder.recyclerView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
}
});
//发送到适配器/构造函数调用的日期
holder.adapter=新的压延机适配器(上下文,列表);
holder.recyclerView.setAdapter(holder.adapter);
}
@凌驾
public int getItemCount(){
如果(list.size()!=0)
返回list.size();
否则返回0;
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
文本视图名称;
ImageView imageFlower;
回收视图回收视图;
TextView monthName;
压延机适配器;
公共MyViewHolder(查看项目视图){
超级(项目视图);
name=itemView.findviewbyd(R.id.flowerNameFLR);
imageFlower=itemView.findViewById(R.id.flowerImgFLR);
recyclerView=itemView.findViewById(R.id.recycler\u view\u Calendar);
monthName=itemView.findViewById(R.id.monthName);
}
}
私有静态列表getDates(字符串dateString1,字符串dateString2){
ArrayList日期=新建ArrayList();
java.text.DateFormat df1=新的SimpleDataFormat(“yyyy-MM-dd”);
Date date1=null;
日期2=空;
试一试{
date1=df1.parse(dateString1);
date2=df1.parse(dateString2);
}捕获(解析异常){
e、 printStackTrace();
}
Calendar cal1=Calendar.getInstance();
cal1.设置时间(日期1);
Calendar cal2=Calendar.getInstance();
计算2.设置时间(日期2);
而(!cal1.在(cal2)之后){
add(cal1.getTime());
cal1.add(Calendar.DATE,1);
}
返回日期;
}
}
下面是子适配器类

CalenderAdapter.java

public class CalenderAdapter extends RecyclerView.Adapter<CalenderAdapter.MyViewHolder> {
    ArrayList<CalenderPojo> list;
    Context context;
    private int mSelectedItem = -1;


    public CalenderAdapter(Context context, ArrayList<CalenderPojo> listCal) {
        this.context = context;
        this.list = listCal;
    }



    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.date_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        final CalenderPojo listPotn = list.get(position);

        holder.day.setText(listPotn.getDay());
        holder.date.setText(listPotn.getDate());
        holder.price.setText("$ "+listPotn.getPrice());


        holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSelectedItem = position;
                notifyDataSetChanged();
              // ((FlowerListAdapter)context).sendTimedetails(position);
            }
        });
        if (mSelectedItem==position) {
            holder.itemView.setBackgroundResource(R.drawable.selected_date_back);
            holder.day.setTextColor(context.getResources().getColor(R.color.white));
            holder.date.setTextColor(context.getResources().getColor(R.color.white));
            holder.price.setTextColor(context.getResources().getColor(R.color.white));
        } else {
            holder.linearLayout.setBackgroundColor(context.getResources().getColor(R.color.primaryLight2));
            holder.day.setTextColor(context.getResources().getColor(R.color.black));
            holder.date.setTextColor(context.getResources().getColor(R.color.black));
            holder.price.setTextColor(context.getResources().getColor(R.color.black));
        }

    }

    @Override
    public int getItemCount() {
        if (list.size() != 0 && list !=null)
            return list.size();
        else return 0;
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView day, date, price;
        LinearLayout linearLayout;

        public MyViewHolder(View itemView) {
            super(itemView);
            day = itemView.findViewById(R.id.day);
            date = itemView.findViewById(R.id.date);
            price = itemView.findViewById(R.id.price);
            linearLayout = itemView.findViewById(R.id.lLayout);
        }
    }
}
公共类CalenderAdapter扩展了RecyclerView.Adapter{
数组列表;
语境;
private int mSelectedItem=-1;
公共日历适配器(上下文,ArrayList listCal){
this.context=上下文;
this.list=listCal;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图项视图=平面布局
holder.adapter = new CalenderAdapter(context, listCal, new RecyclerClickInterface() {
@Override
public void onClick(View view, int position) {
     Log.i(TAG, "position " + position);
    }
});
holder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    mRecyclerClickInterface.onClick(view, position);
   }
});
public interface ClickPosition {
    public void getPosition(int position);
}
public class FlowerListAdapter extends RecyclerView.Adapter<FlowerListAdapter.MyViewHolder>   {

    ArrayList<FlowerListPojo> list;
    Context context;
    ClickPosition clickPosition;

    public FlowerListAdapter(Context context, ArrayList<FlowerListPojo> list) {
        this.context = context;
        this.list = list;
    }

    //Pagination
    public void updateList(ArrayList<FlowerListPojo> list) {
        this.list.addAll(list);
        this.notifyDataSetChanged();
    }


    @Override
    public FlowerListAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.flower_list_row, viewGroup, false);
        return new FlowerListAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(FlowerListAdapter.MyViewHolder holder, int position) {

        LinearLayoutManager mLayoutManager;

        holder.name.setText(list.get(position).getInfo().getName());
        ArrayList<CalenderPojo> listCal = new ArrayList<>();
        Glide.with(context).load(list.get(position).getInfo().getImage())
                .thumbnail(0.5f)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.imageFlower);

        mLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
        holder.recyclerView.setLayoutManager(mLayoutManager);
        holder.recyclerView.setItemAnimator(new DefaultItemAnimator());

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        //todays date
        Date cToday = Calendar.getInstance().getTime();
        String todaysDate = df.format(cToday);
        //last day last next 90 days
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, 90);
        Date d = c.getTime();
        String lastDate = df.format(d);


        List<Date> dates = getDates(todaysDate, lastDate);
        for (Date date : dates) {

            String dayOfTheWeek = (String) DateFormat.format("EEE", date); // Thursday
            String day = (String) DateFormat.format("dd", date); // 20
            String monthString = (String) DateFormat.format("MMMM", date); // Jun
            String monthNumber = (String) DateFormat.format("MM", date); // 06
            String year = (String) DateFormat.format("yyyy", date); // 2013

            listCal.add(new CalenderPojo(dayOfTheWeek, day, "200", monthString + " " + year));
        }

        holder.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                int firstVisiblePosition = mLayoutManager.findFirstVisibleItemPosition();
                if(firstVisiblePosition>=0)
                    holder.monthName.setText(listCal.get(firstVisiblePosition+3).getMonth());
            }
        });

        holder.recyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });



        //Date send to Adapter / Constructor call
        holder.adapter = new CalenderAdapter(context, listCal,clickPosition);
        holder.recyclerView.setAdapter(holder.adapter);
    }


    @Override
    public int getItemCount() {
        if (list.size() != 0)
            return list.size();
        else return 0;
    }


    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView name;
        ImageView imageFlower;
        RecyclerView recyclerView;
        TextView monthName;
        CalenderAdapter adapter;

        public MyViewHolder(View itemView) {
            super(itemView);

            clickPosition= new ClickPosition() {
                @Override
                public void getPosition(int position) {
                    Toast.makeText(context, ""+position, Toast.LENGTH_SHORT).show();
                }
            };
            name = itemView.findViewById(R.id.flowerNameFLR);
            imageFlower = itemView.findViewById(R.id.flowerImgFLR);
            recyclerView = itemView.findViewById(R.id.recycler_view_calender);
            monthName = itemView.findViewById(R.id.monthName);

        }



    }


    private static List<Date> getDates(String dateString1, String dateString2) {
        ArrayList<Date> dates = new ArrayList<Date>();
        java.text.DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

        Date date1 = null;
        Date date2 = null;

        try {
            date1 = df1.parse(dateString1);
            date2 = df1.parse(dateString2);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);


        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);

        while (!cal1.after(cal2)) {
            dates.add(cal1.getTime());
            cal1.add(Calendar.DATE, 1);
        }
        return dates;
    }

}
public class CalenderAdapter extends RecyclerView.Adapter<CalenderAdapter.MyViewHolder> {
    ArrayList<CalenderPojo> list;
    Context context;
    private int mSelectedItem = -1;
    ClickPosition clickPosition;

    public CalenderAdapter(Context context, ArrayList<CalenderPojo> listCal, ClickPosition clickPosition) {
        this.context = context;
        this.list = listCal;
        this.clickPosition = clickPosition;
    }



    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.date_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        final CalenderPojo listPotn = list.get(position);

        holder.day.setText(listPotn.getDay());
        holder.date.setText(listPotn.getDate());
        holder.price.setText("$ "+listPotn.getPrice());


        holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSelectedItem = position;
                notifyDataSetChanged();
                clickPosition.getPosition(position);
                };
                // ((FlowerListAdapter)context).sendTimedetails(position);
            }
        });
        if (mSelectedItem==position) {
            holder.itemView.setBackgroundResource(R.drawable.selected_date_back);
            holder.day.setTextColor(context.getResources().getColor(R.color.white));
            holder.date.setTextColor(context.getResources().getColor(R.color.white));
            holder.price.setTextColor(context.getResources().getColor(R.color.white));
        } else {
            holder.linearLayout.setBackgroundColor(context.getResources().getColor(R.color.primaryLight2));
            holder.day.setTextColor(context.getResources().getColor(R.color.black));
            holder.date.setTextColor(context.getResources().getColor(R.color.black));
            holder.price.setTextColor(context.getResources().getColor(R.color.black));
        }

    }

    @Override
    public int getItemCount() {
        if (list.size() != 0 && list !=null)
            return list.size();
        else return 0;
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView day, date, price;
        LinearLayout linearLayout;

        public MyViewHolder(View itemView) {
            super(itemView);
            day = itemView.findViewById(R.id.day);
            date = itemView.findViewById(R.id.date);
            price = itemView.findViewById(R.id.price);
            linearLayout = itemView.findViewById(R.id.lLayout);
        }
    }
}