【发布时间】:2010-07-02 18:31:38
【问题描述】:
我有一个列表视图,其中包含文本视图作为其元素。
- 现在我希望在启动应用程序时自动聚焦列表的第一项
- 当我单击其他视图(例如按钮)时,如何将焦点设置在列表的任何项目上?
【问题讨论】:
我有一个列表视图,其中包含文本视图作为其元素。
【问题讨论】:
设置选择和设置焦点是两个不同的东西。如果您只想为某个项目设置选择,那么您可以使用下面的代码。
mListView.setSelection(position);
但这绝对不意味着Listview 是专注的。对于专注你必须使用
mListView.requestFocus();
要更改单击按钮的焦点,您可以将代码放在按钮的onClick() 上。
【讨论】:
ListView 有一个setSelected 方法,它获取列表中项目的索引。
【讨论】:
setItemsCanFocus(boolean) 是什么意思?
对我来说问题已经解决了
listView.setItemsCanFocus(true);
【讨论】:
我想我也遇到了同样的情况。我希望能够使用按钮以编程方式控制列表视图的焦点。
一种解决方案是处理setFocusableInTouchMode,但我从未实现过使其工作。
另一个解决方案是忘记焦点并使用可检查的列表视图。首先在 XML 或 java 中将您的列表视图设置为“单选模式”:Mylistview.setChoiceMode(1)
然后您就可以使用Mylistview.setItemChecked(position, true)检查您想要的任何项目
因此,当您启动应用程序 (OnCreate) 时,请使用 Mylistview.setItemChecked(0, true) 检查您的第一个项目。
然后,如果您希望您的按钮选择下一个项目,例如,使用:
Mylistview.setItemChecked(Mylistview.getCheckedItemPosition() + 1, true)
您可以指定项目是否被选中时的外观,并且有不同的预建可检查列表视图。
如果您想了解更多解释,请参阅我的post
【讨论】:
你的 ListView 应该是这样的:
<ListView
android:id="@+id/my_list"
android:layout_width="wrap_content"
android:layout_height="200dp"
android:layout_margin="10dp"
android:choiceMode="none"
android:focusable="true"
android:fadeScrollbars="false">
<requestFocus />
</ListView>
mListView.setSelection(3); //or any other number
【讨论】:
我知道这是一个老问题,但就我而言,我试图以编程方式将一个菜单选项集中在 listView 中以突出显示该项目,但这些都不适合我。这是有效的:
MenuOption 型号:
public class MenuOption {
public static final int ALL_ITEMS = 0;
public static final int CATEGORIES = 1;
public static final int DISCOUNTS = 2;
private int id;
private String name;
private String description;
private boolean isFocused;
public MenuOption(int id, String name, String description, boolean isFocused) {
this.id = id;
this.name = name;
this.description = description;
this.isFocused = isFocused;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isFocused() {
return isFocused;
}
public void setFocused(boolean focused) {
isFocused = focused;
}
}
菜单适配器:
public class MenuAdapter extends BaseAdapter {
private ArrayList<MenuOption> menuOptions; // Original Values
private LayoutInflater inflater;
private MenuOptionListener listener;
private Context context;
public MenuAdapter(Context context, ArrayList<MenuOption> menuOptions, MenuOptionListener listener) {
this.context = context;
this.menuOptions = menuOptions;
this.listener = listener;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return menuOptions.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView menuName;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_menu_option, null);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.menuName = convertView.findViewById(R.id.menu_name);
MenuOption option = menuOptions.get(position);
holder.menuName.setText(option.getName());
if (option.isFocused()) {
convertView.setBackgroundResource(R.color.menu_focus);
holder.menuName.setTextColor(ContextCompat.getColor(context, R.color.white));
holder.menuName.setTypeface(null, Typeface.BOLD);
} else {
convertView.setBackgroundResource(R.color.menu_un_focus);
holder.menuName.setTextColor(ContextCompat.getColor(context, R.color.black));
holder.menuName.setTypeface(null, Typeface.NORMAL);
}
convertView.setOnClickListener(view -> {
if (!option.isFocused()) {
resetFocus(position);
listener.onClicked(option);
}
});
return convertView;
}
public void resetFocus(int position) {
for (int i = 0; i < menuOptions.size(); i++) {
menuOptions.get(i).setFocused(i == position);
}
notifyDataSetChanged();
}
public interface MenuOptionListener {
void onClicked(MenuOption option);
}
}
然后在你的Activity中,你可以调用menuAdapter.resetFocus(0)。
【讨论】: