gpt4 book ai didi

android - 将焦点添加到 ExpandableListView 中的项目

转载 作者:太空宇宙 更新时间:2023-11-03 11:18:51 25 4
gpt4 key购买 nike

这看起来很简单,但对于我来说我无法弄明白。

我有一个 ExpandableListView,它带有从 BaseExpandableListAdapter 派生的自定义 ExpandableListAdapter。当我添加一个新项目时,我只想关注新项目。我无法让它工作。

我尝试了以下方法,但不起作用。这是在 ListView 的 Activity 中:

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 对象。所以我分配项目并在 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();

}

然后在adapter的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() 方法运行之前发生,该方法将分配它(因此它始终为 null)! :-( 请停下来

编辑:我知道这会很草率,但如果我确实运行了一个线程等待几百毫秒以便 getView() 可能运行然后尝试获取 focusEdit 怎么办?

最佳答案

好的,在 Foamy Guy 的帮助下弄明白了。我关于稍等片刻以检查 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 毫秒,它仍然有效。然后只需一毫秒,令人惊讶的是,它也起作用了。 Foam 建议尽量不拖延地发帖,这确实有效。我最终尝试按照 Foamy 的要求直接运行 runnable,但失败了。

所以不确定,但这可以完成工作。感谢大家的帮助。

关于android - 将焦点添加到 ExpandableListView 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com