2

I want to add an image into some cells in ExpandableListI already search for answer on my question and I try to put

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

And it isn't work. I can't do this in getView() in adapter, because I create cells dynamically by downloading data from database, and after it I can say which cell need image.

I also tried to do: Sometimes listView.getChildAt(int index) returns NULL (Android) Nullpointerexception on getChildAt GridView getChildAt() returns null No solution work. It is my code:

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

And Activity:

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

my xml - cell layout

<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>

and 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>

How can I dynamically change image icon in this adapter? Suggestions are highly appreciated.

Community
  • 1
  • 1
DivinaProportio
  • 220
  • 1
  • 3
  • 13
  • Why do you have this: `View v = expListView.getChildAt(j).findViewById(R.id.expListView);`? To me this doesn't make any sense. You are getting the child at the `i` index. Then, you are trying to find within that child the view with an Id equal to your ExpandableList?! Is that it? – luiscosta Aug 08 '14 at 13:49
  • Sorry, it was one of stackoverflow's answer. I forget to remove this part of code. Without .findViewById() it doesn't work too. – DivinaProportio Aug 11 '14 at 07:02

2 Answers2

1

If the child is currently not visible the view might be null since it was recycled, if you need to access data you should get the Adapter instead and fetch the object from it. Please check this answer:

Android: Access child views from a ListView

Community
  • 1
  • 1
FrankMonza
  • 1,894
  • 13
  • 23
0

Try to change this line:

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

To this one:

View v = expListView.getChildAt(j);
luiscosta
  • 847
  • 1
  • 10
  • 16
  • Sorry, it was one of stackoverflow's answer. I forget to remove this part of code. Without .findViewById() it doesn't work too. – DivinaProportio Aug 11 '14 at 07:03