在ListView中获取对视图的引用

时间:2013-04-10 16:31:10

标签: android listview reference get visibility

我在这里与层次结构有点挣扎。我想在listView中使用id delete_img来引用每个ImageButton视图。图像按钮通过行布局xml中的XML添加。

基本上我希望能够在每一行中设置某个元素的可见性,但我无法弄清楚如何获得这种引用。有没有其他方法可以做到这一点?方法deleteShow()是我到目前为止的尝试,但它显然是错误的,因为我在尝试设置可见性时得到一个空指针。

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

}

1 个答案:

答案 0 :(得分:0)

一旦你理解了正在发生的事情,处理ListView的层次结构并不复杂。将ListView视为包含大量子视图或项目的框架。这些项目每个都有子视图,其中包含构成ListView中一行的各个元素。要修改列表Item,您需要(1)更改支持该项目的数据并更新您的ArrayAdapter或(2)找到您尝试修改的个人Item ListView然后对该单个项目的子视图执行操作。

最简单的方法是修改支持列表的适配器中的数据,然后调用notifyDataSetChanged()上的ArrayAdapter更新ListView。我不知道你的适配器是如何设置的,所以给你直接的建议是困难的,但一般的想法是你想要更改支持你要修改的Item的数据,更改那些数据,然后调用notifyDataSetChanged()上的ArrayAdapter,以便ListView反映更改。

直接修改单个项目要复杂得多。您不能一步完成,因为您的代码建议 - 通过ID查找单个视图然后更改其可见性 - 将不会像您怀疑的那样在整个列表中运行。 findViewById可能会返回null,因为它不是在一个单独的列表元素中查找,而是在整个列表中查找 - 即外部列表结构 - 用于不存在的视图。

要以编程方式执行您想要的操作,您需要(1)获取对ListView本身的引用; (2)通过调用getFirstVisiblePosition()找到列表中第一个显示的视图; (3)弄清楚你要修改的项目距第一个可见项目的距离是多少; (4)得到那个项目; (5)修改它

这最终只是屁股的痛苦。修改支持列表和更新的数据要比查找单个视图容易得多。