2012-09-04 64 views
4

這似乎很簡單,但對於我的生活我無法弄清楚這一點。焦點在ExpandableListView中添加了項目

我有一個ExpandableListView,它具有BaseExpandListListAdapter後裔的自定義ExpandableListAdapter。當我添加一個新項目時,我只想集中新項目。我無法讓它工作。

我嘗試了以下方法,但這不起作用。這是使用ListView活動:

private void processNewItem(C360ItemOwner itemOwner, int pos){ 
    Item item = itemOwner.newItem(pos); 
    expAdapter.notifyDatasetChanged(); 
    expandList.requestFocus(); 
    if (item.getParentType() == Item.PARENT_IS_CHECKLIST) {//main level 
     expandList.setSelectedGroup(pos); 
    } else //Item.PARENT_IS_ITEM //sub level 
     expandList.setSelectedChild(item.getParentAsItem().getPosition(), pos, true); 
} 

我試圖在getView方法,適配器做它不工作:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 
     ViewGroup parent) { 
    if (convertView == null) 
     convertView = inf.inflate(R.layout.edit_group_item, null); 
    Item group = (Item) getGroup(groupPosition); 
    convertView.setTag(group); 
    EditText edtParent = (EditText) convertView.findViewById(R.id.edtParent); 
    edtParent.setTag(convertView); 
    scatterItemText(edtParent); 
    if (group.isNew()) { 
     Toast.makeText(edtParent.getContext(), "Found Focus Item " + groupPosition, Toast.LENGTH_SHORT).show(); 
     edtParent.requestFocus(); 
    } 
    return convertView; 
} 

我試圖建立幾個字段在適配器:focusItem,一個只寫Item對象和focusEdit,只讀EditText obect。所以我分配的項目,並在getView中,它將編輯存儲在一個字段中。我這樣稱呼它:

private void processNewItem(C360ItemOwner itemOwner, int pos){ 
    Item item = itemOwner.newItem(pos); 
    expAdapter.setFocusItem(item);//<--Assign it here 
    expAdapter.notifyDatasetChanged(); 
    EditText edtFocus = expAdapter.getFocusEdit(); 
    if (edtFocus != null) 
     edtFocus.requestFocus(); 

} 

然後在適配器的getView:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 
     ViewGroup parent) { 
    if (convertView == null) 
     convertView = inf.inflate(R.layout.edit_group_item, null); 
    Item group = (Item) getGroup(groupPosition); 
    convertView.setTag(group); 
    EditText edtParent = (EditText) convertView.findViewById(R.id.edtParent); 
    edtParent.setTag(convertView); 
    scatterItemText(edtParent); 
    if (group == focusItem) { 
     Toast.makeText(edtParent.getContext(), "Found Focus Item " + groupPosition, Toast.LENGTH_SHORT).show(); 
     focusEdit = edtParent; 
    } 
    return convertView; 
} 

我是爲這最後的方法,但此行很有希望:

EditText edtFocus = expAdapter.getFocusEdit(); 

發生getView BEFORE ()方法運行,它會分配它(所以它始終爲空)! :-(PLZ HALP

編輯:我知道,如果我不跑了線程等待幾百毫秒,使getView()可能會運行,然後試圖讓focusEdit這將是草率的,但什麼

+1

你不需要一個線程來暫停。看看'Handler.postDelayed(Runnable r,int delay);' – FoamyGuy

+1

「我嘗試了以下,這不起作用」爲什麼這不起作用?不要去適配器getView方向 –

+0

@FoamyGuy我會嘗試 –

回答

0

OK? ,想通了泡沫樣蓋伊的幫助下我的預感大約等待了一下,以檢查focusEdit制定了我最初與1000毫秒試着給它足夠的時間:。

private void setFocus() { 
    EditText edtFocus = expAdapter.getFocusEdit(); 
    if (edtFocus != null) 
     edtFocus.requestFocus(); 
    else 
     Toast.makeText(getActivity(), "BLAH!", Toast.LENGTH_SHORT).show(); 
} 

final Runnable r = new Runnable() 
{ 
    public void run() 
    { 
     setFocus(); 

    } 
}; 

private void processNewItem(C360ItemOwner itemOwner, int pos){ 
    Item item = itemOwner.newItem(pos); 
    if (itemOwner.getItemCount() == 1) 
     checkHasItems(); 
    expAdapter.setFocusItem(item); 
    resetListAdapter(true); 
    Handler handler = new Handler(); 
    handler.postDelayed(r, 1000);//this works 
    //handler.postDelayed(r, 10);//this works too 
    //handler.postDelayed(r, 1);//this works too 
    //handler.post(r);//this too! 
    //r.run();//NOT this. This fails. 
} 

然後我嘗試10毫秒它仍然有效,然後只有一毫秒,而且非常有效,泡沫建議儘量在沒有延遲的情況下發布,而且確實有效。我試圖直接根據Foamy的請求運行runnable,但失敗了。

所以不確定,但這可以完成工作。謝謝你們的幫助。

相關問題