0

我有一個ParentActivity具有TextView tvCount,一個片段具有可擴展列表視圖。我需要更新可展開列表視圖中選定的兒童人數。如何將可擴展列表視圖的選定子視圖數據從片段發送到父活動?

在我的片段,我有一個適配器 -

mExpandableListView = (ExpandableListView) view.findViewById(R.id.lvExp); 
mAdapter = new ExpandableServiceListViewAdapter(getActivity(), 
      mGroups); 

ExpandableServiceListViewAdapter.java

public class ExpandableServiceListViewAdapter extends BaseExpandableListAdapter { 


     private static SparseArray<GroupModel> mGroups; 
     public LayoutInflater mInflater; 
     public Activity mActivity; 



public ExpandableServiceListViewAdapter(Activity act, SparseArray<GroupModel> groups) { 
    mActivity = act; 
    this.mGroups = groups; 
    mInflater = act.getLayoutInflater(); 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return mGroups.get(groupPosition).children.get(childPosition); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return 0; 
} 


@Override 
public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    final GroupModel children = (GroupModel) getChild(groupPosition, childPosition); 
    TextView title, duration, gender, actualprice, finalprice; 
    final TextView tvCounter, tvTotalCost; 
    ImageView offericon = null; 
    final CheckBox checkBox; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.services_item, null); 
    } 
    title = (TextView) convertView.findViewById(R.id.tv_title); 
    duration = (TextView) convertView.findViewById(R.id.tv_duration); 
    gender = (TextView) convertView.findViewById(R.id.tv_gender); 
    actualprice = (TextView) convertView.findViewById(R.id.tv_actualprice); 
    finalprice = (TextView) convertView.findViewById(R.id.tv_finalprice); 
    offericon = (ImageView) convertView.findViewById(R.id.iv_offer); 
    checkBox = (CheckBox) convertView.findViewById(R.id.cb_check); 
    tvTotalCost = (TextView) mActivity.findViewById(R.id.tv_cost); 
    tvCounter = (TextView) mActivity.findViewById(R.id.tv_counter); 

    title.setText(children.getmServiceModel().getmServiceTitle()); 
    duration.setText("• " + children.getmServiceModel().getmDuration() + "min"); 
    gender.setText("• " + children.getmServiceModel().getmGender()); 
    actualprice.setText("Rs " + children.getmServiceModel().getmActualPrice()); 
    actualprice.setPaintFlags(actualprice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
    finalprice.setText("\u20B9" + children.getmServiceModel().getmFinalPrice()); 

    if (children.getmServiceModel().getmHasOffer()) { 
     offericon.setVisibility(View.VISIBLE); 
    } else { 
     offericon.setVisibility(View.INVISIBLE); 
    } 


    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      checkBox.toggle(); 
      if (checkBox.isChecked()) { 
       ((BaseActivity) mActivity).showToast("Yes"); 
       BusinessActivity.mSelectedMap.put((groupPosition * 1000) + childPosition, children); 



      } else { 
       ((BaseActivity) mActivity).showToast("No"); 
       BusinessActivity.mSelectedMap.remove((groupPosition * 1000) + childPosition); 

      } 
     } 
    }); 
    return convertView; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return mGroups.get(groupPosition).children.size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return mGroups.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return mGroups.size(); 
} 

@Override 
public void onGroupCollapsed(int groupPosition) { 
    super.onGroupCollapsed(groupPosition); 
} 

@Override 
public void onGroupExpanded(int groupPosition) { 
    super.onGroupExpanded(groupPosition); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return 0; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
         View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.services_group_header, null); 
    } 
    GroupModel group = (GroupModel) getGroup(groupPosition); 
    TextView title = (TextView) convertView.findViewById(R.id.tv_title); 
    title.setText(group.getmTitle()); 
    TextView count = (TextView) convertView.findViewById(R.id.tv_count); 
    count.setText("(" + group.getmCount() + ")"); 

    ImageView iv = (ImageView) convertView.findViewById(R.id.iv_offer); 
    if (group.getmSubCategory().getmHasOffers()) 
     iv.setVisibility(View.VISIBLE); 
    else 
     iv.setVisibility(View.INVISIBLE); 


    return convertView; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return false; 
} 
} 

在這裏,我想創建一個地圖,我需要把它發送給父活動選擇的兒童更新計數。

BusinessActivity.java是具有片段的父活動。 我已經在活動中定義了mSelectedMap。我在選中時將該條目添加到此地圖中,並在未選中時將其刪除。

有人可以幫助我如何設置來自此適配器的父活動中的計數值。

+0

你想送全'BusinessActivity.mSelectedMap'於母公司的活動?如果是的話,你在哪裏創建對象?和「mSelectedMap」究竟是什麼? –

回答

2

有3種方法可以解決您的問題。

  1. 使用全局靜態變量,在片段中定義其值並在其活動中顯示其值。
  2. 在您的活動中創建方法並使用適當的參數從片段中調用它。
  3. 使用EventBus

EventBus簡化了組件之間的通信。它可以很好地處理活動,片段和後臺線程。

Here是EventBus的很好的例子。

+0

嗨,這是推薦的溝通方式。 EventBus看起來簡單而好。下面的答案使用接口進行通信。你認爲最好的方法是什麼? – SkyTreasure

+0

我寧願EventBus –

1

嘗試......

ExpandableServiceListViewAdapter.java

public class ExpandableServiceListViewAdapter extends BaseExpandableListAdapter { 


private SparseArray<GroupModel> mGroups; 
public LayoutInflater mInflater; 
public Activity mActivity; 
private OnChildClick onChildClick; 


public ExpandableServiceListViewAdapter(Activity act, SparseArray<GroupModel> groups, 
             OnChildClick onChildClick) { 
    mActivity = act; 
    this.mGroups = groups; 
    this.onChildClick = onChildClick; 
    mInflater = act.getLayoutInflater(); 
}  


@Override 
public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    final GroupModel children = (GroupModel) getChild(groupPosition, childPosition); 
    ........ 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      checkBox.toggle(); 
      if (checkBox.isChecked()) { 
       if (null != onChildClick) { 
        onChildClick.onClick((groupPosition * 1000) + childPosition, children, "Yes"); 
       } 
      } else { 
       if (null != onChildClick) { 
        onChildClick.onClick((groupPosition * 1000) + childPosition, children, "No"); 
       } 
      } 
     } 
    }); 
    return convertView; 
    } 



    //other override methods 
    ...... 

    //interface to get selected item 
    public interface OnChildClick { 
    void onClick(int position, GroupModel children, String status); 
    } 
} 

YourFragment.java

public class YourFragment extends Fragment{ 

    private OnItemSelectedListener mCallback; 
    private Activity activity; 
    ExpandableServiceListViewAdapter mAdapter; 
    ExpandableListView mExpandableListView; 
    ..... 

    @Override 
    public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // This makes sure that the container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     mCallback = (OnItemSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnItemSelectedListener"); 
    } 
    } 


    // interface to update UI changes in BusinessActivity at runtime 
    public interface OnItemSelectedListener { 
    void onItemPicked(int position,GroupModel children, String status); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_expandable_list, container, false); 
    mExpandableListView = (ExpandableListView) view.findViewById(R.id.lvExp); 
    return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 

     mAdapter = new ExpandableServiceListViewAdapter(getActivity(), 
      mGroup, mOnChildClick); 

    } 

     private ExpandableServiceListViewAdapter.OnChildClick mOnChildClick 
     = new ExpandableServiceListViewAdapter.OnChildClick() { 
    @Override 
    public void onClick(int position,GroupModel children, String status) { 

     // Through interface 
     try { 
      ((OnItemSelectedListener) activity).onItemPicked(position, children, status); 
     } catch (Exception cce) { 
      cce.printStackTrace(); 
     } 


     //OR accsee directly 

     if(status.equalsIgnoreCase("Yes")){ 
      ((BusinessActivity)activity).mSelectedMap.put(position, children); 
     }else { 
      ((BusinessActivity)activity).mSelectedMap.remove(position); 
     } 
     } 
    }; 


    } 

BusinessActivity.java

public class BusinessActivity extends Activity implements YourFragment.OnItemSelectedListener 
    { 
    ..... 

    //Override the method here 
    @Override 
    public void onItemPicked(position, children, status) 
    { 
    //Do something with the position value passed back 
    Toast.makeText(activity, "status "+ status, Toast.LENGTH_LONG).show(); 
    //Do something with the position value passed back 
    Toast.makeText(activity, "status "+ status, Toast.LENGTH_LONG).show(); 
    if(status.equalsIgnoreCase("Yes")){ 
      mSelectedMap.put(position, children) 
    }else { 
      mSelectedMap.remove(position); 
    } 
    } 

    ..... 
    } 

快樂編碼....

相關問題