如何将可扩展列表视图的选定子视图数据从片段发送到父活动?
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