在Android中设置列表视图的任何项目的焦点

roqulrg3  于 2023-04-04  发布在  Android
关注(0)|答案(6)|浏览(119)

我有一个listview,其中包含textviews作为其元素。
1.现在我希望列表的第一个项目在启动应用程序时自动聚焦
1.当我点击其他视图,例如按钮时,如何将焦点设置在列表中的任何项目上?

vsdwdz23

vsdwdz231#

设置选择和设置焦点是两件不同的事情。如果你想只设置选择到一些项目,那么你可以使用下面的代码。

mListView.setSelection(position);

但这并不意味着Listview是对焦的。

mListView.requestFocus();

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

bprjcwpo

bprjcwpo2#

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

kupeojn6

kupeojn63#

对我来说,这个问题是由

listView.setItemsCanFocus(true);
hgc7kmma

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
aemubtdh

aemubtdh5#

我想我也遇到过同样的情况,我希望能够用按钮以编程方式控制列表视图的焦点。
一个解决方案是处理setFocusableInTouchMode,但我从未实现过使其工作。
另一种解决方案是忘记焦点,使用可检查的列表视图。首先在XML或java中将列表视图设置为“单选模式”:Mylistview.setChoiceMode(1)
然后,您就可以使用Mylistview.setItemChecked(position, true)检查任何您想要的项目
因此,当您启动应用程序(OnCreate)时,使用Mylistview.setItemChecked(0, true)检查第一个项目。
然后,如果你想让你的按钮选择下一个项目,例如,用途:

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

您可以指定检查或不检查项目时的外观,并且有不同的预构建可检查列表视图。
如果你想要更多的解释,请看我的帖子

d5vmydt9

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)

相关问题