簡體   English   中英

如何將可擴展列表視圖的選定子視圖數據從片段發送到父活動?

[英]How to send selected child view data of expandable list view from fragment to parent activity?

我有一個具有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,在選擇時將條目添加到此地圖中,而在未選擇時將其刪除。

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

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

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

EventBus簡化了組件之間的通信。 它在“活動”,“片段”和背景線程中表現良好。

是EventBus的好例子。

嘗試這個...

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

  .....
  }

祝您編程愉快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM