2

スピナーを含むrecylerviewで、スピナーにアイテムを動的に追加する方法(特定の位置のみ)...今、私が子供用スピナーを更新するとき、recylerviewのすべてのスピナーは更新されています。その特定の位置(recylerviewの)のスピナーのみを更新してください。私はこのアダプタを呼び出していた場所からrecyclerviewのスピナーを更新

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 
     { 

     } 



    } 
} 

フラグメント:(recylerviewでこれらのスピナーを膨張さ)私のアダプタである後

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クラス:

public class CommonListViewItems { 

    String listItem; 

    public String getlistItem() { 
     return listItem; 
    } 

    public void setlistItem(String listItem) { 
     this.listItem = listItem; 
    } 
} 

recyclerviewは次のようになります。

enter image description here

と私はTimePickerDialogから複数の項目(時間)を追加したいのですが、追加項目は、各スピナーに追加取得されたスピナーをクリックすることで、Iあなたが同じspinnerAdapteの複数のインスタンスを必要とする

+1

私は本当に試してみました。しかし、あなたのコードはとても難しく、エラーを見つけることができないのは不思議ではありません。しかし、私はすべてのあなたの意見が同じスピナーアダプターと同じデータを共有しているため、これが信じています。 –

+0

今すぐお試しください。私は不要なコードを削除しました。今すぐお試しください...本当に必要です.. –

+2

ViewHolderごとに1つのスピナー・アダプター・インスタンスと1つのスピナー・データを用意してください。この方法で彼らはお互いに独立しています –

答えて

0

はい、異なるデータセットを持つ各アダプタのインスタンスが異なると、recyclerviewの選択された位置にある特定のスピナーアダプタを更新できます。とSpinnerAdpaterの別のインスタンスでSpinnerためrecyclerviewonBindViewHolderで今

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; 
} 
  • setAdapter

    1. のようなのArrayListのArrayListの作成:

      は、私はこのような私の問題を解決しました別のデータセット(リストまたはarraylistなど):

      public void onBindViewHolder(MyViewHolder holder, int position) { 
      holder.spinner.setAdapter(new CustomSpinnerAdapter(context,R.layout.common_listview_item,list[position])); 
      
    2. そして、我々はこのように、一覧または特定のスピナーのアダプタに項目を追加することができます。

      list[position].add(item); 
      

    を、このように、それだけでspinnerは、私たちが更新したい更新されます/ /すなわち与えられた位置のスピナー。

    したがって、RecyclerViewの所定の位置でスピナーを更新することができます。

  • 1

    ...事前に

    ありがとう:だけ触れられている特定のスピナーに追加しますrを異なるデータセットで置き換えます。

    arraylistを使用して、チェックデーのテキストビューについても同じことを行いました。その場合、onBindViewHolderでは、日の値はリスト内の位置によって異なります。同じことを試みてください。

    +0

    アダプターの異なるインスタンスと同じスピナーをリンクするにはどうすればよいですか?どのようにアダプタの異なるインスタンスにスピナーのsetadapterをするには? onbinderview()内の –

    +1

    は、このホルダーを置く.spinnerLeavingTime.setAdapter(new CustomSpinnerAdapter(dataset.get(position));ここで、datasetは毎週のarraylistまたはmapです。 – masp

    +0

    なぜデータセットを渡す必要がありますか?データセットの代わりにget(position)を使用するか? –

    1

    それはrowItemsのそれぞれが何であるかをあなたが投稿コードから明らかではないので、私は、私はこれがアプローチする方法をレイアウトします:

    1)任意の行項目の個別のレイアウトを作成し、これが含まれている必要がありますCheckBox、その日を保持するTextView、および時間を埋めるSpinnerがあります。

    2)「DayAndTimeSelection」などのように、これらをまとめて表すオブジェクトを作成します。これらのオブジェクトのそれぞれは、その行のSpinnerとそのスピナーにある可能な時間のセットを関連付ける必要があるため、独自のSpinnerインスタンスと独自のSpinnerAdapterインスタンスを持ちます。

    これは先に進む前に1つの行項目に対するとして期待動作することを確認します....

    3)個々の行のコレクション全体を処理し、外側「DayAndTimeItemListAdapter」を作成します。あなたの例では、このリストには7つのアイテムしかありませんが、毎月のビューに変更すると30になるかもしれません。それぞれの行に対して抽象化を正しく行い、各行項目内の値を変更し、スピナーへの時間とチェックボックスの取得/設定がクリアされます。外部アダプタはビューをリサイクルする場所ですので、リストのgetView()とgetItem()が期待どおりに動作し、各行に個別のSpinnerおよびSpinnerAdapterインスタンスがあることを確認してくださいその行のSpinnerの '@'記号の後にあるID & SpinnerAdapter ... like: 'SpinnerAdapter @ 1234')

    4)利益...

    +0

    別の行のdifferenetレイアウトを言っているのですか?同じレイアウトを膨張させるのではなく、異なるレイアウトをリンクするのですか? –

    関連する問題