2013-04-10 77 views
1

我在这里与层次结构稍微挣扎。我想要在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(); 
} 

}

回答

0

一旦你明白这是怎么回事了处理ListView层级并不复杂。将ListView想象为包含一堆子视图或项目的框架。这些项目每个都有子视图,由构成ListView中的一行的各个元素组成。要修改列表Item您需要(1)更改支持该项目的数据并更新您的ArrayAdapter或(2)找到您想要从ListView内修改的个人Item,然后针对该单个项目的子视图进行操作。

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

直接修改单个项目要复杂得多。您无法一步完成您的代码 - 根据id查找单个视图,然后更改其可见性 - 将无法按照您的怀疑操作整个列表。 findViewById更喜欢返回null,因为它没有在一个单独的列表元素内查找,而是在整个列表内(即外部列表结构)查看不在那里的视图。

要做你想要的程序,你需要(1)获得对ListView本身的参考; (2)通过调用getFirstVisiblePosition()找到列表中的第一个显示的视图; (3)弄清楚第一个可见物品距离你想要修改的物品有多远; (4)获得该项目; (5)修改它

这最终只是在屁股疼痛。它更容易修改支持列表和更新的数据,而不是查找单个视图。

+0

好吧,我有点怀疑这一点。让我说清楚。据我了解,不可能获得对具有id(suchandsuch)的列表行中的每个元素的引用,并且单独获取每个元素,并且由于listView的工作方式,听起来像是一场噩梦。 理论上,因为我当前的按钮是一个XML元素。我可以将它从XML中删除,将它添加回每个列表行中编程生成的引用,当我需要让它们出现/消失后使用? – lorless 2013-04-10 18:24:59

+0

如果你列出的是一个固定的长度也许。假设你可以正确地获得对这些按钮的引用,你需要维护一个单独的列表来跟踪这些引用。什么是触发他们被删除的情况?也许我可以建议一个更简单的方法? – Rarw 2013-04-10 19:27:09

+0

该按钮在每行中的一组文本视图之后存在。本质上它是一个删除按钮,允许用户删除与该行相关的信息。我希望能够随意显示/隐藏删除按钮,因为我不希望用户不小心点击删除按钮。 (加上它看起来很糟糕)。 – lorless 2013-04-10 19:45:26