lorless
lorless

Reputation: 4478

Getting references to views in ListView

I''m struggling a little with the hierarchy here. I'd like to get references to every ImageButton view with the id delete_img in my listView. The imagebutton is added via the XML in the row layout xml.

Essentially i want to be able to set the visibility of a certain element within every row but i cant figure out how to get that sort of reference. Is there an alternative way of doing this? The method deleteShow() is my attempt to get at it so far but its obviously wrong as i am getting a Null Pointer when trying to set the Visibility.

NotesFragment

public class NotesFragment extends ListFragment {

private CommentsDataSource datasource;
private View v = null;



public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Cursor theNotes = (Cursor) returnNotes();
    String[] projection = { MySQLiteHelper.COLUMN_ID,
            MySQLiteHelper.COLUMN_COMMENT,
            MySQLiteHelper.COLUMN_COMMENTNAME,
            MySQLiteHelper.COLUMN_FOLDERFK };
    int[] to = new int[] { R.id.id_txt, R.id.content_txt, R.id.title_text };
    @SuppressWarnings("deprecation")
    SimpleCursorAdapter sca = new SimpleCursorAdapter(getActivity(),
            R.layout.notes_list_layout, theNotes, projection, to);
    setListAdapter(sca);

    View v = inflater.inflate(R.layout.notesfragment, container, false);
    deleteShow();

    return v;
}

@Override
public void onListItemClick(ListView parent, View v, int position, long id) {

    Intent intentView = new Intent(getActivity().getApplicationContext(),
            ViewNote.class);
    intentView.putExtra("id", id);

    startActivity(intentView);
}

public Cursor returnNotes() {
    Cursor theNotesCursor = null;
    datasource = new CommentsDataSource(getActivity());
    datasource.open();
    theNotesCursor = datasource.getAllCommentsAsCursor();
    return theNotesCursor;
}

public void deleteShow() {
    ImageButton b = (ImageButton) getActivity().findViewById(R.id.delete_img);
    b.setVisibility(View.INVISIBLE);
}



public void onPause() {
    super.onPause();
    datasource.close();
}

}

Upvotes: 1

Views: 1131

Answers (1)

Rarw
Rarw

Reputation: 7663

The hierarchy for dealing with ListView is not that complicated once you understand what's going on. Think of the ListView as the framwork that holds a bunch of child views or Items. Those Items each have child views that consist of the individual elements that make up a row in the ListView. To modify a list Item you either need to (1) change the data backing that item and update your ArrayAdapter or (2) find the individual Item you are trying to modify from within the ListView and then act on the child views for that individual item.

The easiest way to do this is to modify the data in the adapter backing the list and then call notifyDataSetChanged() on your ArrayAdapter to update the ListView. I don't know how your adapter is set up so to give you direct advice is difficult but the general idea is that you want to change the data backing the Item you want to modify, change that data, and then call notifyDataSetChanged() on the ArrayAdapter so that the ListView reflects the changes.

To modify an individual item directly is much more complicated. You cannot do it in one step as your code proposes - finding the individual view by id and then changing its visibility - will not operate accross the entire list as you suspect. findViewById is likley returning null because it is not looking within an indvidual list element but within the whole list - i.e. the outer list structure - for a view that is not there.

To do what you want programatically you need to (1) get a reference to the ListView itself; (2) find the first displayed view within the list by calling getFirstVisiblePosition(); (3) figure out how far down from that first visibile item is the item you want to modify; (4) get that item; (5) modify it

This ends up just being a pain in the ass. Its much easier to modify the data backing the list and update than to find single view.

Upvotes: 1

Related Questions