【问题标题】:set focus on any item of listview in android将焦点设置在 android 中的任何列表视图项上
【发布时间】:2010-07-02 18:31:38
【问题描述】:

我有一个列表视图,其中包含文本视图作为其元素。

  1. 现在我希望在启动应用程序时自动聚焦列表的第一项
  2. 当我单击其他视图(例如按钮)时,如何将焦点设置在列表的任何项目上?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    设置选择和设置焦点是两个不同的东西。如果您只想为某个项目设置选择,那么您可以使用下面的代码。

        mListView.setSelection(position);
    

    但这绝对不意味着Listview 是专注的。对于专注你必须使用

        mListView.requestFocus();
    

    要更改单击按钮的焦点,您可以将代码放在按钮的onClick() 上。

    【讨论】:

      【解决方案2】:

      ListView 有一个setSelected 方法,它获取列表中项目的索引。

      【讨论】:

      • 您好,但所选列表项与焦点列表项相同?
      • AFAIK 选择与焦点不同。
      • 嗨罗比,setItemsCanFocus(boolean) 是什么意思?
      【解决方案3】:

      对我来说问题已经解决了

      listView.setItemsCanFocus(true);
      

      【讨论】:

      • 那如何开启Listview的onItemClick呢?因为在这种情况下,我们需要为单击单个项目视图编写单独的代码。
      【解决方案4】:

      我想我也遇到了同样的情况。我希望能够使用按钮以编程方式控制列表视图的焦点。

      一种解决方案是处理setFocusableInTouchMode,但我从未实现过使其工作。

      另一个解决方案是忘记焦点并使用可检查的列表视图。首先在 XML 或 java 中将您的列表视图设置为“单选模式”:Mylistview.setChoiceMode(1)

      然后您就可以使用Mylistview.setItemChecked(position, true)检查您想要的任何项目

      因此,当您启动应用程序 (OnCreate) 时,请使用 Mylistview.setItemChecked(0, true) 检查您的第一个项目。

      然后,如果您希望您的按钮选择下一个项目,例如,使用:

      Mylistview.setItemChecked(Mylistview.getCheckedItemPosition() + 1, true)
      

      您可以指定项目是否被选中时的外观,并且有不同的预建可检查列表视图。

      如果您想了解更多解释,请参阅我的post

      【讨论】:

        【解决方案5】:
        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>
          
        2. mListView.setSelection(3); //or any other number

        【讨论】:

          【解决方案6】:

          我知道这是一个老问题,但就我而言,我试图以编程方式将一个菜单选项集中在 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)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-25
            • 1970-01-01
            相关资源
            最近更新 更多