适配器不调用getChildView android

问题描述:

我正在试图开发3级下可扩展列表视图,但膨胀后,第一级项目不能看到第一级的孩子卡住了。适配器不调用getChildView android

只显示父视图不显示二级视图,甚至没有发生任何点击事件。

import android.content.Context; 
import android.graphics.Color; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.Button; 
import android.widget.ExpandableListView; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.ListView; 
import android.widget.TextView; 

import com.ofd.R; 
import com.ofd.base.BaseFragment; 
import com.ofd.utils.Utils; 

import static com.ofd.utils.Constants.LEFT_ICON_PREVIOUS; 
import static com.ofd.utils.Constants.NONE; 

/* 
* This fragment is used to show the Agencies expanable list 
* 
* @author girish.sharma 
* 
*/ 

public class AgenciesFragment extends BaseFragment implements OnItemClickListener { 
    private View view; 
    private Button mSubmit; 
    public static int Service = -1; 
    private Context mContext; 

    ExpandableListView explvlist; 
    private ViewHolder mViewHolder; 
    private LayoutInflater mInflater; 

    /** 
    * This is the function used to initialize the view of the fragment 
    ***/ 
    @Override 
    protected View initUI(LayoutInflater inflater, ViewGroup container) { 
     if (view == null) { 
      view = inflater.inflate(R.layout.agencies_fragment, null); 
      mContext = getActivity(); 
      mInflater = LayoutInflater.from(mContext); 
      explvlist = (ExpandableListView) view.findViewById(R.id.ParentLevel); 
      explvlist.setAdapter(new ParentLevel()); 
      explvlist.setOnItemClickListener(this); 
     } 
     return view; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View arg1, int position, long arg3) { 
     super.onItemClick(adapterView, arg1, position, arg3); 
     Utils.showToast(mContext, "Click"); 
    } 

    public class ParentLevel extends BaseExpandableListAdapter { 

     @Override 
     public Object getChild(int arg0, int arg1) { 

      return arg1; 
     } 

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

     @Override 
     public View getChildView(int groupPosition, int childPosition, 
           boolean isLastChild, View convertView, ViewGroup parent) { 
      CustExpListview SecondLevelexplv = new CustExpListview(mContext); 
      SecondLevelexplv.setAdapter(new SecondLevelAdapter()); 
      SecondLevelexplv.setGroupIndicator(null); 
      return SecondLevelexplv; 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
      return 3; 
     } 

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

     @Override 
     public int getGroupCount() { 
      return 5; 
     } 

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

     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, 
           View convertView, ViewGroup parent) { 
      View view = convertView; 
      if (view == null) { 
       mViewHolder = new ViewHolder(); 
       LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService 
         (Context.LAYOUT_INFLATER_SERVICE); 
       view = inflater.inflate(R.layout.row_first, parent, false); 
       // Inflate the layout that you want for each row 
       /*convertView = mInflater.inflate(R.layout.row_first, parent, false);*/ 
       /*mViewHolder.txtViewTitle = (TextView) view.findViewById(R.id.txtViewTitleMain);*/ 

       // Add a reference in ViewHolder for your Button, find it like the TextViews and define its OnClickListener here too, eventually... 
       /*view.setTag(mViewHolder);*/ 
      } /*else 
       mViewHolder = (ViewHolder) view.getTag();*/ 
      mViewHolder.txtViewTitle = (TextView) view.findViewById(R.id.txtViewTitleMain); 

      mViewHolder.txtViewTitle.setText("FirstLevel"); 
      /*TextView tv = new TextView(mContext); 
      tv.setText("->FirstLevel"); 
      tv.setBackgroundColor(Color.WHITE); 
      tv.setPadding(10, 7, 7, 7);*/ 

      return view; 
     } 

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

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

    public class CustExpListview extends ExpandableListView { 

     int intGroupPosition, intChildPosition, intGroupid; 

     public CustExpListview(Context context) { 
      super(context); 
     } 

     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); 
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST); 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     } 
    } 

    public class SecondLevelAdapter extends BaseExpandableListAdapter { 

     @Override 
     public Object getChild(int groupPosition, int childPosition) { 
      return childPosition; 
     } 

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

     @Override 
     public View getChildView(int groupPosition, int childPosition, 
           boolean isLastChild, View convertView, ViewGroup parent) { 
      TextView tv = new TextView(mContext); 
      tv.setText("child"); 
      tv.setPadding(15, 5, 5, 5); 
      tv.setBackgroundColor(Color.GRAY); 
      tv.setLayoutParams(new ListView.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
      return tv; 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
      return 5; 
     } 

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

     @Override 
     public int getGroupCount() { 
      return 1; 
     } 

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

     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, 
           View convertView, ViewGroup parent) { 
      TextView tv = new TextView(mContext); 
      tv.setText("-->Second Level"); 
      tv.setPadding(12, 7, 7, 7); 
      tv.setBackgroundColor(Color.RED); 

      return tv; 
     } 

     @Override 
     public boolean hasStableIds() { 
      // TODO Auto-generated method stub 
      return true; 
     } 

     @Override 
     public boolean isChildSelectable(int groupPosition, int childPosition) { 
      // TODO Auto-generated method stub 
      return true; 
     } 
    } 

    /** 
    * Here change the header text 
    ***/ 
    @Override 
    public void onResume() { 
     TitleBarFragment fragment = (TitleBarFragment) getFragment(R.id.activity_fragment_launcher_header); 
     if (fragment != null) { 
      fragment.setTitleBarVisibility(true); 
      fragment.setHeaderTitleAndSideIcon(getActivity().getResources() 
          .getString(R.string.fragment_agencies_header), 
        LEFT_ICON_PREVIOUS, NONE); 
     } 

     super.onResume(); 
    } 

    private class ViewHolder { 
     private TextView txtViewTitle; 
    } 
} 
+0

你没有很好地实现查看持有者模式 –

+0

是的,它只是一个运行时代码尝试多个事情,使其工作。 –

+0

如果我仅保留Item中的textview,则代码工作正常。 但是我需要在列表项中填充texview和复选框。 –

我花了几个小时试图找到同样的问题,才意识到这是一件死在我身边很简单:

  1. 出于某种原因(现在我将调试它) - 的groupview做触摸时不会展开。
  2. 由于组视图没有展开,所以没有理由浪费CPU周期来获取不会显示的视图。
  3. 适配器中与孩子有关的所有方法都不会被调用。

尝试调用explvlist.expandGroup(0 ... n)手动将其展开并查看它是否在适配器中调用与子相关的方法。