Android 获取对ListView中视图的引用

Android 获取对ListView中视图的引用,android,listview,reference,get,visibility,Android,Listview,Reference,Get,Visibility,我正在为这里的等级制度挣扎。我想在我的listView中获得每个id为delete\u img的ImageButton视图的引用。imagebutton是通过行布局XML中的XML添加的 本质上,我希望能够在每一行中设置某个元素的可见性,但我不知道如何获得这种引用。有没有其他方法可以做到这一点?方法deleteShow()是我迄今为止尝试使用的方法,但它显然是错误的,因为我在尝试设置可见性时得到了一个空指针 注释片段 public class NotesFragment extends List

我正在为这里的等级制度挣扎。我想在我的listView中获得每个id为delete\u img的ImageButton视图的引用。imagebutton是通过行布局XML中的XML添加的

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

注释片段

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

}

一旦您了解了所发生的事情,处理
列表视图的层次结构就不再那么复杂了。可以将
ListView
看作是一个框架,其中包含一组子视图或项。这些项都有子视图,子视图由构成
列表视图中一行的各个元素组成。要修改列表
,您需要(1)更改支持该项的数据并更新
阵列适配器
,或者(2)从
列表视图
中查找您试图修改的单个
,然后对该单个项的子视图执行操作

最简单的方法是修改支持列表的适配器中的数据,然后在
ArrayAdapter
上调用
notifyDataSetChanged()
以更新
ListView
。我不知道您的适配器是如何设置的,因此很难直接向您提供建议,但一般的想法是,您希望更改支持要修改的
项的数据,更改该数据,然后在
ArrayAdapter
上调用
notifyDataSetChanged()
,以便
ListView
反映更改

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

要以编程方式执行您想要的操作,您需要(1)获取对
列表视图
本身的引用;(2) 通过调用
getFirstVisiblePosition()
,查找列表中显示的第一个视图;(3) 计算出要修改的项目距离第一个可视项目有多远;(4) 获取该项目;(5) 修改它


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

一旦您了解了所发生的事情,处理
列表视图的层次结构就没有那么复杂了。可以将
ListView
看作是一个框架,其中包含一组子视图或项。这些项都有子视图,子视图由构成
列表视图中一行的各个元素组成。要修改列表
,您需要(1)更改支持该项的数据并更新
阵列适配器
,或者(2)从
列表视图
中查找您试图修改的单个
,然后对该单个项的子视图执行操作

最简单的方法是修改支持列表的适配器中的数据,然后在
ArrayAdapter
上调用
notifyDataSetChanged()
以更新
ListView
。我不知道您的适配器是如何设置的,因此很难直接向您提供建议,但一般的想法是,您希望更改支持要修改的
项的数据,更改该数据,然后在
ArrayAdapter
上调用
notifyDataSetChanged()
,以便
ListView
反映更改

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

要以编程方式执行您想要的操作,您需要(1)获取对
列表视图
本身的引用;(2) 通过调用
getFirstVisiblePosition()
,查找列表中显示的第一个视图;(3) 计算出要修改的项目距离第一个可视项目有多远;(4) 获取该项目;(5) 修改它


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

好吧,我有点怀疑。让我说清楚。据我所知,由于listView的工作方式,不可能获取对列表行中具有id(suchHandsuch)的每个元素的引用,并单独获取每个元素,这样做听起来像一场噩梦。理论上,因为我当前的按钮是一个XML元素。我是否可以将其从XML中删除,并将其添加回以编程方式生成的每个列表行中,其中包含引用,以便在以后需要使它们出现/消失时使用?如果列表的长度是固定的,则可能。假设您可以正确地获得这些按钮的引用,那么您需要维护一个单独的列表来跟踪这些引用。是什么情况触发了他们的撤职?也许我可以建议一种更简单的方法?按钮位于每行的一组文本视图之后。本质上,它是一个删除按钮,允许用户删除与该行关联的信息。我希望能够随意显示/隐藏删除按钮,因为我不希望用户意外单击删除按钮。(加上它