在回收站视图中更新微调器
update spinner in a recyclerview
在包含微调器的 recylerview 中,如何在微调器中动态添加更多项目(仅在特定位置)...现在,当我更新子微调器时,recylerview 的所有微调器都在更新。请帮我只更新那个特定位置的微调器(recylerview)。
以下是我的适配器(它在 recylerview 中为这些微调器充气):
public class OfferRideRegularListViewAdapter extends RecyclerView.Adapter<OfferRideRegularListViewAdapter.MyViewHolder> implements SelectTimeFragment.SelectedTimeListener
{
LayoutInflater inflater;
CustomSpinnerAdapter leavingTimeAdpater,returningTimneAdpater;
ArrayList<CommonListViewItems> leavingTimeItemsList,returningTimeItemsList;
List<String> checkedItemsList;
Context context;
View convertView;
private static final int LEAVING_TIMEPICKER_FRAGMENT = 2;
private static final int RETURNING_TIMEPICKER_FRAGMENT = 3;
private Fragment fragment;
private int selectedDayPosition;
private ArrayList<CommonListViewItems> leavingTimeOfDayList,returningTimeOfDayList;
private ViewGroup viewGroup;
private int TIMEPICKER_FRAGMENT=0;
private CommonListViewItems items;
RecylerView recyclerView;
public OfferRideRegularListViewAdapter(Context context,ArrayList<CommonListViewItems> leavingTimeItemsList,ArrayList<CommonListViewItems> returningTimeItemsList,RecylerView recyclerView) {
this.context=context;
this.recyclerView = recyclerView;
inflater = LayoutInflater.from(context);
this.leavingTimeItemsList = leavingTimeItemsList;
this.returningTimeItemsList = returningTimeItemsList;
checkedItemsList = Arrays.asList(context.getResources().getStringArray(R.array.week_days));
leavingTimeAdpater=new CustomSpinnerAdapter(context,R.layout.common_listview_item,this.leavingTimeItemsList);
returningTimneAdpater = new CustomSpinnerAdapter(context,R.layout.common_listview_item,this.returningTimeItemsList);
leavingTimeOfDayList = new ArrayList<CommonListViewItems>();
for (int i=0;i<checkedItemsList.size();i++)
{
items = new CommonListViewItems();
items.setlistItem(leavingTimeItemsList.get(0).getlistItem());
leavingTimeOfDayList.add(items);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_offer_ride_regular_list_items, parent, false);
convertView = itemView;
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.checkDay.setText(checkedItemsList.get(position));
holder.spinnerLeavingTime.setAdapter(leavingTimeAdpater);
holder.spinnerReturningTime.setAdapter(returningTimneAdpater);
}
@Override
public int getItemCount() {
return checkedItemsList.size();
}
public int getCount() {
return checkedItemsList.size();
}
public void showSelectTimeDialog(int TIMEPICKER_FRAGMENT)
{
this.TIMEPICKER_FRAGMENT = TIMEPICKER_FRAGMENT;
FragmentManager fm = ((MainActivity)context).getFragmentManager();
SelectTimeFragment selectTimeFragment = new SelectTimeFragment();
selectTimeFragment.setSelectedTimeListener(this);
selectTimeFragment.show(fm,"TimePicker");
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
public CheckBox checkDay;
public Spinner spinnerLeavingTime;
public Spinner spinnerReturningTime;
public MyViewHolder(View view) {
super(view);
checkDay=(CheckBox)view.findViewById(R.id.checkedDay);
spinnerLeavingTime=(Spinner)view.findViewById(R.id.spinner_leavingTime);
spinnerReturningTime=(Spinner)view.findViewById(R.id.spinner_returningTime);
spinnerLeavingTime.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == (leavingTimeAdpater.getCount() - 1)) {
hideKeyboard(view);
selectedDayPosition = getAdapterPosition();
showSelectTimeDialog(LEAVING_TIMEPICKER_FRAGMENT);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
@Override
public String onTimeSelected(String selectedTime) {
updateChildSpinnerList(selectedTime);
return null;
}
@Override
public void onTimeNotSelected(boolean noTimeSelected) {
}
private void updateChildSpinnerList(String selectedTime)
{
if (selectedTime!=null)
{
CommonListViewItems items;
switch (TIMEPICKER_FRAGMENT)
{
case LEAVING_TIMEPICKER_FRAGMENT:
{
items = new CommonListViewItems();
items.setlistItem(selectedTime);
items = new CommonListViewItems();
items.setlistItem("Change...");
leavingTimeOfDayList.remove(selectedDayPosition);
leavingTimeOfDayList.add(selectedDayPosition, items);
Spinner spinner= (Spinner) recyclerView.getChildAt(selectedDayPosition).findViewById(R.id.spinner_leavingTime);
notifyItemChanged(selectedDayPosition);
}
}
}
else
{
}
}
}
我调用此适配器的片段:
offerRideRegularListViewAdapter = new OfferRideRegularListViewAdapter(getActivity(),getLeavingTimeList(),getReturningTimeList(),listEachDay);
listEachDay.setAdapter(offerRideRegularListViewAdapter);
以下是 CustomSpinnerAdpater:
public class CustomSpinnerAdapter extends ArrayAdapter<CommonListViewItems> {
CommonListViewItems servicesItem;
Context context;
int layoutId;
private ArrayList<CommonListViewItems> itemsArrayList;
public CustomSpinnerAdapter(Context context, int layoutId, ArrayList<CommonListViewItems> itemsArrayList)
{
super(context,layoutId,itemsArrayList);
this.context = context;
this.layoutId=layoutId;
this.itemsArrayList=itemsArrayList;
}
@Override
public int getCount() {
return itemsArrayList.size();
}
@Override
public CommonListViewItems getItem(int position) {
return itemsArrayList.get(position);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position,convertView,parent);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
return getCustomView(position,convertView,parent);
}
private View getCustomView(int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
if (convertView==null)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(layoutId,parent,false);
holder=new ViewHolder();
servicesItem = new CommonListViewItems();
holder.textView=(TextView)convertView.findViewById(R.id.tv_listItems);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
final CommonListViewItems servicesItem =(CommonListViewItems)itemsArrayList.get(position);
holder.textView.setText(servicesItem.getlistItem());
return convertView;
}
private class ViewHolder
{
public TextView textView;
}
}
和 CommonListViewItems class:
public class CommonListViewItems {
String listItem;
public String getlistItem() {
return listItem;
}
public void setlistItem(String listItem) {
this.listItem = listItem;
}
}
recyclerview 看起来像这样:
单击微调器后,我想从 TimePickerDialog 添加更多项目(时间),但是添加的项目正在添加到每个微调器,我只想添加到被触摸的特定微调器:
提前致谢...
您需要具有不同数据集的同一 spinnerAdapter 的多个实例。
您已经使用 arraylist 为 checkday 文本视图完成了相同的操作。在这种情况下,在 onBindViewHolder 中,日期的值取决于列表中的位置。尝试做同样的事情。
从您发布的代码中不清楚每个 rowItem 是什么,所以我将布局我可能如何处理此问题:
1) 为任意行项目制作单独的布局,这应包含 CheckBox、用于显示日期的 TextView 以及要填充时间的 Spinner。
2) 创建一个代表所有这些的对象,如 'DayAndTimeSelection' 或类似的。这些对象中的每一个都将有自己的 Spinner 实例和它们自己的 SpinnerAdapter 实例,因为您需要在该行的 Spinner 和该微调器中的可能时间集之间建立关联。
在继续之前验证这对一行项目的预期效果....
3) 创建一个外部 'DayAndTimeItemListAdapter' 来处理单个行的整个集合。在您的示例中,此列表中只有 7 个项目,但如果您更改为每月视图,您可能会得到 30 个。如果您对每一行进行正确的抽象,更改每个行项目中的值,添加微调器的时间和 getting/setting 复选框将被清除。外部 Adapter 是您将回收视图的地方,因此请确保列表的 getView() 和 getItem() 按预期工作,并且每一行都有一个单独且唯一的 Spinner 和 SpinnerAdapter 实例(查看该行的 Spinner 和 SpinnerAdapter 中“@”符号后的 ID...例如:'SpinnerAdapter@1234')
4) 利润...
是的,每个具有不同数据集的适配器的不同实例可以更新回收器视图中选定位置的特定微调器适配器。
我这样解决了我的问题:
创建 ArrayList 的 ArrayList,如:
ArrayList<String> [] list = new ArrayList[predefined_size];
for (int i=0;i<7;i++)
{
list[i]=new ArrayList<String>();
list[i].addAll(parentList); //parentList is an ArrayList of custom items;
}
现在在 recyclerview
的 onBindViewHolder
中,Spinner
的 setAdapter
具有不同的 SpinnerAdpater
实例和单独的数据集(列表或数组列表等),像这样:
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.spinner.setAdapter(new CustomSpinnerAdapter(context,R.layout.common_listview_item,list[position]));
然后我们可以将项目添加到特定微调器的列表或适配器中,如下所示:
list[position].add(item);
这样,只有 spinner
会更新我们要更新的 // 即给定位置的微调器。
这样就实现了更新RecyclerView中给定位置的spinner
在包含微调器的 recylerview 中,如何在微调器中动态添加更多项目(仅在特定位置)...现在,当我更新子微调器时,recylerview 的所有微调器都在更新。请帮我只更新那个特定位置的微调器(recylerview)。
以下是我的适配器(它在 recylerview 中为这些微调器充气):
public class OfferRideRegularListViewAdapter extends RecyclerView.Adapter<OfferRideRegularListViewAdapter.MyViewHolder> implements SelectTimeFragment.SelectedTimeListener
{
LayoutInflater inflater;
CustomSpinnerAdapter leavingTimeAdpater,returningTimneAdpater;
ArrayList<CommonListViewItems> leavingTimeItemsList,returningTimeItemsList;
List<String> checkedItemsList;
Context context;
View convertView;
private static final int LEAVING_TIMEPICKER_FRAGMENT = 2;
private static final int RETURNING_TIMEPICKER_FRAGMENT = 3;
private Fragment fragment;
private int selectedDayPosition;
private ArrayList<CommonListViewItems> leavingTimeOfDayList,returningTimeOfDayList;
private ViewGroup viewGroup;
private int TIMEPICKER_FRAGMENT=0;
private CommonListViewItems items;
RecylerView recyclerView;
public OfferRideRegularListViewAdapter(Context context,ArrayList<CommonListViewItems> leavingTimeItemsList,ArrayList<CommonListViewItems> returningTimeItemsList,RecylerView recyclerView) {
this.context=context;
this.recyclerView = recyclerView;
inflater = LayoutInflater.from(context);
this.leavingTimeItemsList = leavingTimeItemsList;
this.returningTimeItemsList = returningTimeItemsList;
checkedItemsList = Arrays.asList(context.getResources().getStringArray(R.array.week_days));
leavingTimeAdpater=new CustomSpinnerAdapter(context,R.layout.common_listview_item,this.leavingTimeItemsList);
returningTimneAdpater = new CustomSpinnerAdapter(context,R.layout.common_listview_item,this.returningTimeItemsList);
leavingTimeOfDayList = new ArrayList<CommonListViewItems>();
for (int i=0;i<checkedItemsList.size();i++)
{
items = new CommonListViewItems();
items.setlistItem(leavingTimeItemsList.get(0).getlistItem());
leavingTimeOfDayList.add(items);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_offer_ride_regular_list_items, parent, false);
convertView = itemView;
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.checkDay.setText(checkedItemsList.get(position));
holder.spinnerLeavingTime.setAdapter(leavingTimeAdpater);
holder.spinnerReturningTime.setAdapter(returningTimneAdpater);
}
@Override
public int getItemCount() {
return checkedItemsList.size();
}
public int getCount() {
return checkedItemsList.size();
}
public void showSelectTimeDialog(int TIMEPICKER_FRAGMENT)
{
this.TIMEPICKER_FRAGMENT = TIMEPICKER_FRAGMENT;
FragmentManager fm = ((MainActivity)context).getFragmentManager();
SelectTimeFragment selectTimeFragment = new SelectTimeFragment();
selectTimeFragment.setSelectedTimeListener(this);
selectTimeFragment.show(fm,"TimePicker");
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
public CheckBox checkDay;
public Spinner spinnerLeavingTime;
public Spinner spinnerReturningTime;
public MyViewHolder(View view) {
super(view);
checkDay=(CheckBox)view.findViewById(R.id.checkedDay);
spinnerLeavingTime=(Spinner)view.findViewById(R.id.spinner_leavingTime);
spinnerReturningTime=(Spinner)view.findViewById(R.id.spinner_returningTime);
spinnerLeavingTime.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == (leavingTimeAdpater.getCount() - 1)) {
hideKeyboard(view);
selectedDayPosition = getAdapterPosition();
showSelectTimeDialog(LEAVING_TIMEPICKER_FRAGMENT);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
@Override
public String onTimeSelected(String selectedTime) {
updateChildSpinnerList(selectedTime);
return null;
}
@Override
public void onTimeNotSelected(boolean noTimeSelected) {
}
private void updateChildSpinnerList(String selectedTime)
{
if (selectedTime!=null)
{
CommonListViewItems items;
switch (TIMEPICKER_FRAGMENT)
{
case LEAVING_TIMEPICKER_FRAGMENT:
{
items = new CommonListViewItems();
items.setlistItem(selectedTime);
items = new CommonListViewItems();
items.setlistItem("Change...");
leavingTimeOfDayList.remove(selectedDayPosition);
leavingTimeOfDayList.add(selectedDayPosition, items);
Spinner spinner= (Spinner) recyclerView.getChildAt(selectedDayPosition).findViewById(R.id.spinner_leavingTime);
notifyItemChanged(selectedDayPosition);
}
}
}
else
{
}
}
}
我调用此适配器的片段:
offerRideRegularListViewAdapter = new OfferRideRegularListViewAdapter(getActivity(),getLeavingTimeList(),getReturningTimeList(),listEachDay);
listEachDay.setAdapter(offerRideRegularListViewAdapter);
以下是 CustomSpinnerAdpater:
public class CustomSpinnerAdapter extends ArrayAdapter<CommonListViewItems> {
CommonListViewItems servicesItem;
Context context;
int layoutId;
private ArrayList<CommonListViewItems> itemsArrayList;
public CustomSpinnerAdapter(Context context, int layoutId, ArrayList<CommonListViewItems> itemsArrayList)
{
super(context,layoutId,itemsArrayList);
this.context = context;
this.layoutId=layoutId;
this.itemsArrayList=itemsArrayList;
}
@Override
public int getCount() {
return itemsArrayList.size();
}
@Override
public CommonListViewItems getItem(int position) {
return itemsArrayList.get(position);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position,convertView,parent);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
return getCustomView(position,convertView,parent);
}
private View getCustomView(int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
if (convertView==null)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(layoutId,parent,false);
holder=new ViewHolder();
servicesItem = new CommonListViewItems();
holder.textView=(TextView)convertView.findViewById(R.id.tv_listItems);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
final CommonListViewItems servicesItem =(CommonListViewItems)itemsArrayList.get(position);
holder.textView.setText(servicesItem.getlistItem());
return convertView;
}
private class ViewHolder
{
public TextView textView;
}
}
和 CommonListViewItems class:
public class CommonListViewItems {
String listItem;
public String getlistItem() {
return listItem;
}
public void setlistItem(String listItem) {
this.listItem = listItem;
}
}
recyclerview 看起来像这样:
单击微调器后,我想从 TimePickerDialog 添加更多项目(时间),但是添加的项目正在添加到每个微调器,我只想添加到被触摸的特定微调器:
提前致谢...
您需要具有不同数据集的同一 spinnerAdapter 的多个实例。
您已经使用 arraylist 为 checkday 文本视图完成了相同的操作。在这种情况下,在 onBindViewHolder 中,日期的值取决于列表中的位置。尝试做同样的事情。
从您发布的代码中不清楚每个 rowItem 是什么,所以我将布局我可能如何处理此问题:
1) 为任意行项目制作单独的布局,这应包含 CheckBox、用于显示日期的 TextView 以及要填充时间的 Spinner。
2) 创建一个代表所有这些的对象,如 'DayAndTimeSelection' 或类似的。这些对象中的每一个都将有自己的 Spinner 实例和它们自己的 SpinnerAdapter 实例,因为您需要在该行的 Spinner 和该微调器中的可能时间集之间建立关联。
在继续之前验证这对一行项目的预期效果....
3) 创建一个外部 'DayAndTimeItemListAdapter' 来处理单个行的整个集合。在您的示例中,此列表中只有 7 个项目,但如果您更改为每月视图,您可能会得到 30 个。如果您对每一行进行正确的抽象,更改每个行项目中的值,添加微调器的时间和 getting/setting 复选框将被清除。外部 Adapter 是您将回收视图的地方,因此请确保列表的 getView() 和 getItem() 按预期工作,并且每一行都有一个单独且唯一的 Spinner 和 SpinnerAdapter 实例(查看该行的 Spinner 和 SpinnerAdapter 中“@”符号后的 ID...例如:'SpinnerAdapter@1234')
4) 利润...
是的,每个具有不同数据集的适配器的不同实例可以更新回收器视图中选定位置的特定微调器适配器。
我这样解决了我的问题:
创建 ArrayList 的 ArrayList,如:
ArrayList<String> [] list = new ArrayList[predefined_size]; for (int i=0;i<7;i++) { list[i]=new ArrayList<String>(); list[i].addAll(parentList); //parentList is an ArrayList of custom items; }
现在在
recyclerview
的onBindViewHolder
中,Spinner
的setAdapter
具有不同的SpinnerAdpater
实例和单独的数据集(列表或数组列表等),像这样:public void onBindViewHolder(MyViewHolder holder, int position) { holder.spinner.setAdapter(new CustomSpinnerAdapter(context,R.layout.common_listview_item,list[position]));
然后我们可以将项目添加到特定微调器的列表或适配器中,如下所示:
list[position].add(item);
这样,只有 spinner
会更新我们要更新的 // 即给定位置的微调器。
这样就实现了更新RecyclerView中给定位置的spinner