ExpandableListView getChildAt()返回null

时间:2014-08-08 13:27:55

标签: android android-layout expandablelistadapter

我想在ExpandableListI中的某些单元格中添加图片我已经在我的问题上搜索答案了,我试着把

expListView.getLastVisiblePosition();
expListView.getFirstVisiblePosition();

它不起作用。我不能在适配器中的getView()中执行此操作,因为我通过从数据库下载数据来动态创建单元格,之后我可以说哪个单元格需要图像。

我也尝试过这样做: Sometimes listView.getChildAt(int index) returns NULL (Android) Nullpointerexception on getChildAt GridView getChildAt() returns null 没有解决方案。 这是我的代码:

public class ExpandableListAdapter extends BaseExpandableListAdapter {
    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String,String> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, String> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition));
    }

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

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

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

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

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

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.spinner, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(Controller.getInstance().getTypeface());
        lblListHeader.setText(headerTitle);

        //I can' do this in this place
        //ImageView iv = (ImageView)convertView.findViewById(R.id.exc);
        //iv.setImageResource(R.drawable.excl);

        return convertView;
    }

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

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

活动:

public class ExpertZone extends Activity{
    String err;
    Context context;
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, String> listDataChild;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expert_zone);

        context=this;

        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.expListView);

        // preparing list data
        prepareListData();

    }

    /*
     * Preparing the list data
     */
    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, String>();

        DBexpertTask dbTask = new DBexpertTask(getString(R.string.expertServlet)) {
            @Override
            protected void onPostExecute(JSONObject obj) {
                JSONArray jArray = new JSONArray();
                try {
                    JSONArray jsonObject = obj.getJSONArray(getString(R.string.data));
                    for (int i = 0; i < jsonObject.length(); i++) {
                        JSONObject object = jsonObject.getJSONObject(i);
                        err = object.getString(getString(R.string.err));
                        if(err.equals(getString(R.string.no))) {
                            jArray = object.getJSONArray(getString(R.string.data));
                            for (int j = 0; j < jArray.length(); j++) {
                                JSONObject values = jArray.getJSONObject(j);
                                listDataHeader.add(String.valueOf(values.get(getString(R.string.who)).toString()));
                                listDataChild.put(String.valueOf(values.get(getString(R.string.who)).toString()), String.valueOf(values.get(getString(R.string.what)).toString()));
                            }
                        }

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                listAdapter = new ExpandableListAdapter(context, listDataHeader, listDataChild);

                // setting list adapter
                expListView.setAdapter(listAdapter);

               for(int j=0; j<expListView.getCount(); j++){
                    expListView.getLastVisiblePosition();
                    expListView.getFirstVisiblePosition();
                    View v = expListView.getChildAt(j).findViewById(R.id.expListView);
                    ImageView iv = (ImageView) v.findViewById(R.id.exc);
                    iv.setImageResource(R.drawable.excl);
                }

            }
        };
        dbTask.execute();
    }
}

我的xml - 单元格布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="6">

    <TextView
        android:id="@+id/lblListHeader"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:gravity="center_vertical|center_horizontal"
        android:layout_weight="5"
        android:layout_width="0dp"
        android:layout_height="60dp"
        android:textSize="18dp"  />
    <ImageView
        android:id="@+id/exc"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center_vertical|center_horizontal"
        android:layout_gravity="center_vertical" />
</LinearLayout>

和expert_zone.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_alignParentBottom="true"
    >

    <ExpandableListView
        android:id="@+id/expListView"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>
</LinearLayout>

如何在此适配器中动态更改图像图标? 建议得到高度赞赏。

2 个答案:

答案 0 :(得分:1)

如果孩子当前不可见,则视图可能为空,因为它被回收,如果您需要访问数据,则应该获取适配器并从中获取对象。请检查这个答案:

Android: Access child views from a ListView

答案 1 :(得分:0)

尝试更改此行:

View v = expListView.getChildAt(j).findViewById(R.id.expListView);

对此:

View v = expListView.getChildAt(j);