1

我在这里的等级制度有点挣扎。我想在我的 listView 中获取对每个 ID 为 delete_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();
}

}

4

1 回答 1

1

ListView一旦你了解了发生了什么,处理的层次结构就没有那么复杂了。可以将其ListView视为拥有一堆子视图或项目的框架。这些项目每个都有子视图,这些子视图由组成ListView. 要修改列表Item,您需要 (1) 更改支持该项目的数据并更新您的ArrayAdapter或 (2)Item从内部找到您尝试修改的个人ListView,然后对该单个项目的子视图执行操作。

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

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

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

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

于 2013-04-10T17:56:27.733 回答