如何将可扩展列表视图的选定子视图数据从片段发送到父活动?

Posted

技术标签:

【中文标题】如何将可扩展列表视图的选定子视图数据从片段发送到父活动?【英文标题】:How to send selected child view data of expandable list view from fragment to parent activity? 【发布时间】:2016-05-27 04:12:10 【问题描述】:

我有一个具有 TextView tvCount 的 ParentActivity,一个具有可扩展列表视图的片段。我需要更新在可展开列表视图中选择的子项数。

在我的片段中,我有一个适配器 -

 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。我在选择时将条目添加到此地图中,在未选择时将其删除。

有人可以帮我如何设置此适配器的父活动中的计数值。

【问题讨论】:

您想将整个BusinessActivity.mSelectedMap 发送到父活动吗?如果是的话,你在哪里创建那个对象? mSelectedMap 到底是什么? 【参考方案1】:

有 3 种方法可以解决您的问题。

    使用全局静态变量,在您的片段中定义其值并在您的活动中显示其值。 在您的活动中创建方法并使用适当的参数从片段中调用它。 使用EventBus。

EventBus 简化了组件之间的通信。它在活动、片段和后台线程中表现良好。

Here 是 EventBus 的一个很好的例子。

【讨论】:

嗨,这是推荐的这种交流方式。 EventBus 看起来简单又好用。下面的答案使用接口进行通信。您认为最好的方法是什么? 我更喜欢 EventBus【参考方案2】:

试试这个...

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);
    
   
 
  .....
  

【讨论】:

以上是关于如何将可扩展列表视图的选定子视图数据从片段发送到父活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何将可扩展的 ListView 放入 ScrollView

如何将数据从一个 Fragment 发送到另一个 Fragment?

多级可扩展列表视图

是否可以将一个对象从一个片段发送到另一个片段?

将数据从嵌套片段发送到父片段

如何在片段中填充列表视图?