【问题标题】:Getting references to views in ListView在 ListView 中获取对视图的引用
【发布时间】:2013-04-02 15:00:39
【问题描述】:

我对这里的层次结构有点挣扎。我想在我的 listView 中获取对每个 ID 为 delete_img 的 ImageButton 视图的引用。 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();
}

}

【问题讨论】:

    标签: android listview reference get visibility


    【解决方案1】:

    一旦您了解发生了什么,处理ListView 的层次结构就不会那么复杂了。将ListView 视为拥有一堆子视图或项目的框架。这些项目每个都有子视图,这些子视图由组成ListView 中的一行的各个元素组成。要修改列表 Item,您需要 (1) 更改支持该项目的数据并更新您的 ArrayAdapter 或 (2) 从 ListView 中找到您尝试修改的个人 Item,然后采取行动在该单个项目的子视图上。

    最简单的方法是修改支持列表的适配器中的数据,然后在您的ArrayAdapter 上调用notifyDataSetChanged() 以更新ListView。我不知道您的适配器是如何设置的,因此很难给您直接建议,但总体思路是您想要更改支持您想要修改的 Item 的数据,更改该数据,然后调用 @987654332 @ 在ArrayAdapter 上,以便ListView 反映更改。

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

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

    这最终只会让人头疼。修改支持列表和更新的数据比查找单个视图要容易得多。

    【讨论】:

    • 好吧,我有点怀疑这一点。让我说清楚。据我了解,由于 listView 的工作方式,不可能获得对列表行中具有 id (suchandsuch) 的每个元素的引用,并单独获取每个元素并这样做听起来像是一场噩梦。从理论上讲,因为我当前的按钮是一个 XML 元素。我可以从 XML 中删除它,将其添加回以编程方式生成的每个列表行中,并在我需要让它们稍后出现/消失时使用引用?
    • 如果你的列表是固定长度的。假设您可以正确获得对这些按钮的引用,则需要维护一个单独的列表来跟踪这些引用。什么情况会触发他们的移除?也许我可以提出一个更简单的方法?
    • 按钮存在于每一行的一组文本视图之后。本质上,它是一个删除按钮,允许用户删除与该行关联的信息。我希望能够随意显示/隐藏删除按钮,因为我不希望用户不小心单击删除按钮。 (而且它看起来很糟糕)。
    • 喜欢在iOS平台上滑动?我想不出一个简单的方法来实现这一点。问题是按钮必须在列表中的一个项目内。全局删除项听起来好像不起作用。这会容易得多,因为您可以在 onClick 上获取项目并将其轻松地从列表中删除。要删除单个 TextView,您将不得不这样做。
    • 是的,类似于 iOS。本质上,我想隐藏删除按钮,以便用户无法单击它们。我很惊讶没有明显的方法可以做到这一点。删除按钮查找并获取列表视图中不可见的 ID 字段文本视图(因为我找不到更好的方法),然后将其从数据库中删除。 id 喜欢做的就是在给定某个命令的情况下隐藏删除按钮。如果没有简单的方法可以做到这一点,请接受您的回答并关闭问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多