我在这里与层次结构有点挣扎。我想在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();
}
}
答案 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)修改它
这最终只是屁股的痛苦。修改支持列表和更新的数据要比查找单个视图容易得多。