2013-04-10 57 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