我有一个listview,其中包含textviews作为其元素。1.现在我希望列表的第一个项目在启动应用程序时自动聚焦1.当我点击其他视图,例如按钮时,如何将焦点设置在列表中的任何项目上?
vsdwdz231#
设置选择和设置焦点是两件不同的事情。如果你想只设置选择到一些项目,那么你可以使用下面的代码。
mListView.setSelection(position);
但这并不意味着Listview是对焦的。
Listview
mListView.requestFocus();
要在单击按钮时更改焦点,可以将代码放在按钮的onClick()上。
onClick()
bprjcwpo2#
ListView有一个setSelected方法,它获取列表中项的索引。
kupeojn63#
对我来说,这个问题是由
listView.setItemsCanFocus(true);
hgc7kmma4#
1.你的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
aemubtdh5#
我想我也遇到过同样的情况,我希望能够用按钮以编程方式控制列表视图的焦点。一个解决方案是处理setFocusableInTouchMode,但我从未实现过使其工作。另一种解决方案是忘记焦点,使用可检查的列表视图。首先在XML或java中将列表视图设置为“单选模式”:Mylistview.setChoiceMode(1)然后,您就可以使用Mylistview.setItemChecked(position, true)检查任何您想要的项目因此,当您启动应用程序(OnCreate)时,使用Mylistview.setItemChecked(0, true)检查第一个项目。然后,如果你想让你的按钮选择下一个项目,例如,用途:
setFocusableInTouchMode
Mylistview.setChoiceMode(1)
Mylistview.setItemChecked(position, true)
Mylistview.setItemChecked(0, true)
Mylistview.setItemChecked(Mylistview.getCheckedItemPosition() + 1, true)
您可以指定检查或不检查项目时的外观,并且有不同的预构建可检查列表视图。如果你想要更多的解释,请看我的帖子
d5vmydt96#
我知道这是一个老问题,但在我的情况下,我试图以编程方式聚焦listView中的菜单选项以突出显示项目,这些都不适合我。这是有效的:菜单选项型号:
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)。
menuAdapter.resetFocus(0)
6条答案
按热度按时间vsdwdz231#
设置选择和设置焦点是两件不同的事情。如果你想只设置选择到一些项目,那么你可以使用下面的代码。
但这并不意味着
Listview
是对焦的。要在单击按钮时更改焦点,可以将代码放在按钮的
onClick()
上。bprjcwpo2#
ListView有一个setSelected方法,它获取列表中项的索引。
kupeojn63#
对我来说,这个问题是由
hgc7kmma4#
1.你的ListView应该是这样的:
aemubtdh5#
我想我也遇到过同样的情况,我希望能够用按钮以编程方式控制列表视图的焦点。
一个解决方案是处理
setFocusableInTouchMode
,但我从未实现过使其工作。另一种解决方案是忘记焦点,使用可检查的列表视图。首先在XML或java中将列表视图设置为“单选模式”:
Mylistview.setChoiceMode(1)
然后,您就可以使用
Mylistview.setItemChecked(position, true)
检查任何您想要的项目因此,当您启动应用程序(OnCreate)时,使用
Mylistview.setItemChecked(0, true)
检查第一个项目。然后,如果你想让你的按钮选择下一个项目,例如,用途:
您可以指定检查或不检查项目时的外观,并且有不同的预构建可检查列表视图。
如果你想要更多的解释,请看我的帖子
d5vmydt96#
我知道这是一个老问题,但在我的情况下,我试图以编程方式聚焦listView中的菜单选项以突出显示项目,这些都不适合我。这是有效的:
菜单选项型号:
菜单适配器:
然后在Activity中,您可以调用
menuAdapter.resetFocus(0)
。