android根据物理按键上下选中listview的item,回车进入点击相应事件

2023-11-08

最近做扫码枪程序,因应用于冷库,用户需求在列表选择上可以用上下键代替滑动,所以做了一个小demo,记录一下

话不多说,直接上代码

1.布局文件很简单 主界面:

一个输入框一个列表,因为是手持采集枪,输入框经常用到,所以在做demo的时候也加上了,不需要的可以忽略

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        tools:context="jg.wanghf.com.listviewdemo.MainActivity">
    <EditText
            android:id="@+id/edit"
            android:layout_width="match_parent"
              android:layout_height="wrap_content"/>
<ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
          android:layout_height="match_parent">

</ListView>

</LinearLayout>

自布局文件+适配器:

简单的一个显示文本

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TextView
            android:id="@+id/textview"
            android:layout_width="match_parent"
              android:layout_height="80dp"/>
</LinearLayout>
package jg.wanghf.com.listviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class VxAdapter extends BaseAdapter {

    private List<String> stringList ;
    private Context context ;
    private LayoutInflater inflater;
    public VxAdapter(List<String> stringList,Context context) {
        this.context = context;
        this.stringList = stringList;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return stringList.size();
    }

    @Override
    public Object getItem(int position) {
        return stringList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_string, null);
            viewHolder = new ViewHolder();
            viewHolder.textView =  convertView.findViewById(R.id.textview);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.textView.setText(stringList.get(position));
        return convertView;
    }

    class ViewHolder {
        //                          商品编码                   商品名称                 预期单位                    预期数量
        private TextView textView;

    }
}

 这样基本的列表就完成了;

item获取焦点的方法setSelection(pisition);

根据上下键进行item获取焦点方法很简单;只需要监听按键,然后调用此方法就好了:


    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        final int action = event.getAction();
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_DOWN:
                // 移到下一项
                if (select_item<stringList.size()-1&&action==0){
                    listView.setSelection(select_item + 1);
                }
                break;
            case KeyEvent.KEYCODE_DPAD_UP:
                // 移到上一项
                if (select_item>0&&action==0){
                    listView.setSelection(select_item - 1);

                }
                break;
            case KeyEvent.KEYCODE_ENTER:

                switch (v.getId()){
                    case R.id.edit:
                        System.out.println("edit======"+1111111);
                        break;
                    default:
                        System.out.println(v.getId());
                        break;
                }
                break;
        }
        return false;
    }

此时要注意,推荐使用OnKeyListener来获取,这样可以根据不同的列表做处理,如果是单独的列表可以直接使用dispatchKeyEvent方法,此时,应该注意到我这边使用的是select_item变量值来得到当前获取到焦点的item的pisition并不是直接select_item++,select_item怎么获取呢

listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                System.out.println("onItemSelected========"+stringList.get(position)+"======"+position);
                select_item = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                select_item = -1;
                listView.setSelection(select_item);
                System.out.println("onNothingSelected========");
            }
        });
listview 有一个监听方法可以获取当前被选中的item,setOnItemSelectedListener,在这获取被选中的item可以避免混乱

至此,功能基本完成了,但是要注意,如果用户滑动后再按上下键,此时默认选中的还是从第一个开始,所以要对listview滑动进行监听,当用户滑动完成后更新select_item的值

 listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                System.out.println("onScrollStateChanged========="+scrollState);
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                select_item = firstVisibleItem-1;
                System.out.println("onScroll==========="+firstVisibleItem+"======="+visibleItemCount+"======"+totalItemCount);
            }
        });

 参数对应含义:

firstVisibleItem: 表示在屏幕中第一条显示的数据在adapter中的位置
  visibleItemCount:则表示屏幕中最后一条数据在adapter中的数据,
  totalItemCount则是在adapter中的总条数

我这边默认select_item为显示界面的上一条,这样当向下按键时会选中屏幕显示的第一条

若点击事件触发后返回此界面不刷新list,注意在点击时也更新select_item,

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                select_item = position;
                System.out.println("onItemClick111111========"+stringList.get(position)+"======"+position);
            }
        });

activity完整代码

package jg.wanghf.com.listviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.*;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnKeyListener {

    private List<String> stringList;
    private VxAdapter vxAdapter;
    private ListView listView;
    private int select_item;
    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initView() {
        listView = findViewById(R.id.listview);
        editText = findViewById(R.id.edit);
        listView.setOnKeyListener(this);
        editText.setOnKeyListener(this);
        stringList = new ArrayList<>();
        select_item = -1;
    }

    private void initData() {
        for (int i=0;i<30;i++){
            stringList.add("test==="+i);
        }
        vxAdapter = new VxAdapter(stringList,this);
        listView.setAdapter(vxAdapter);
//        listView.setSelection(select_item);
        listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                System.out.println("onItemSelected========"+stringList.get(position)+"======"+position);
                select_item = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                select_item = -1;
                listView.setSelection(select_item);
                System.out.println("onNothingSelected========");
            }
        });
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                select_item = position;
                System.out.println("onItemClick111111========"+stringList.get(position)+"======"+position);
            }
        });
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                System.out.println("onScrollStateChanged========="+scrollState);
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                select_item = firstVisibleItem-1;
                System.out.println("onScroll==========="+firstVisibleItem+"======="+visibleItemCount+"======"+totalItemCount);
            }
        });
    }




    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        final int action = event.getAction();
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_DOWN:
                // 移到下一项
                if (select_item<stringList.size()-1&&action==0){
                    listView.setSelection(select_item + 1);
                }
                break;
            case KeyEvent.KEYCODE_DPAD_UP:
                // 移到上一项
                if (select_item>0&&action==0){
                    listView.setSelection(select_item - 1);

                }
                break;
            case KeyEvent.KEYCODE_ENTER:

                switch (v.getId()){
                    case R.id.edit:
                        System.out.println("edit======"+1111111);
                        break;
                    default:
                        System.out.println(v.getId());
                        break;
                }
                break;
        }
        return false;
    }
}

 至此,功能算完成了

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android根据物理按键上下选中listview的item,回车进入点击相应事件 的相关文章

随机推荐

  • SpringBoot开发使用篇(2)—数据层解决方案

    目录 一 数据层解决方案 1 1 SQL 1 1 1 数据源配置 Hikari 1 1 2 持久化技术 JdbcTemplate 1 1 3 H2数据库 1 2 NoSQL 1 2 1 Redis 1 2 2 Mongodb 1 2 3 E
  • 链式法则

    2个事件同时发生的概率 P a b P a b P b 其中 P a b 表示 a和b事件同时发生的概率 P a b 是一个条件概率 表示在b事件发生的条件下 a发生的概率 3个事件的概率链式调用 P a b c P a b c P b c
  • 三、Linux网络编程:Socket编程-网络模型

    3 Socket编程 网络模型 3 1 OSI七层模型 图解 每层的功能 模型 功能 物理层 比特流传输 数据链路层 网络控制 链路纠错 网络层 寻址 路由 传输层 建立主机端到端的连接 会话层 建立 维护和管理会话 表示层 格式转化 加密
  • 解决sqlplus /as sysdba登陆oracle无效

    安装完oracle 然后执行完下面的自动配置脚本后 没有任何地方设置过密码 etc init d oracledb ORCLCDB 19c configure 在这个命令执行完成后 会提醒查看完整日志的地方 Look at the log
  • C语言100例 第一天习题练习

    C语言中基本的输入与输出 例题1 输入两个正整数a和b 输出a b的值 其中a b 10000 include
  • Centos7 开机卡死在桌面

    问题 Centos7 开机死卡成了这样 一动不动 如下图 原因 一般来说是一些开机自启的东西使得Centos卡死 有可能是在 etc rc d rc local文件里加入的脚本 也有可能 etc fstab文件里面自动挂载的硬盘 解决方法
  • 【自然语言处理】情感分析(三):基于 Word2Vec 的 LSTM 实现

    情感分析 三 基于 Word2Vec 的 LSTM 实现 本文是 情感分析 系列的第 3 3 3 篇 前两篇分别是 自然语言处理 情感分析 一 基于 NLTK 的 Naive Bayes 实现 自然语言处理 情感分析 二 基于 scikit
  • jmeter调试错误大全

    一 前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题 但是无从下手 不知道从哪里开始找起 对于初学者而言这是一个非常头痛的事情 这里结合笔者的经验 总结出以下方法 二 通过查看运行日志调试问题 写好脚本后 可以先试着运
  • 【保姆级】Python最新版3.11.1开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)

    工欲善其事必先利其器 在使用Python开发程序之前 在计算机上搭建Python开发环境是必不可少的环节 目前Python最新稳定版本是3 11 1 且支持到2027年 如下图所示 本文手把手带你从0 到1搭建Python最新版3 11 1
  • 如何在Mac上远程控制另一台Mac

    1 先请在苹果 Mac 电脑上的 系统偏好设置 窗口中打开 共享 功能 2 接着在共享窗口中的左侧点击启用 屏幕共享 选项 3 当屏幕共享功能打开以后 请点击 电脑设置 按钮 4 随后请勾选二个选项 VNC 显示程序可以使用密码控制屏幕 并
  • 异步赠书:9月重磅新书升级,本本经典

    本期活动已结束 新活动地址 http blog csdn net epubit17 article details 78210459 获奖读者名单 如下 领取赠书步骤 1 加入异步社区活动QQ群439467328 2 在下方地址中填写收件信
  • java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决

    jetty 9 嵌入式开发时 启动正常 但是页面一浏览就报错如下 java lang NoSuchMethodError javax servlet http HttpServletRequest isAsyncStarted Z 原因 j
  • 用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码

    一 i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度 如果是vue2点几 记得安装i18n的 8版本 不然会自动安装的最新版本 后面会报错哦 查询了下资料 好像最新版本是适配的vue3 npm install vue i1
  • angular请求的防抖(debounce)

    在开发项目过程中 我们会遇到这样的场景 当用户在搜索框中输入名字时 当用户输入完毕后 自动发送搜索请求 实时响应 而不是多按一个按钮或者回车键 如果按照常规思路 我们会绑定input的keyup事件 每次击键后 执行相对应的请求函数 但是
  • MyBatis 3 提示 Column ‘******‘ specified twice

    造成错误的原因是 Mapper xml 配置文件 insert 语句写入重复字段 错误配置文件展示
  • 如何进行本地分支管理

    文章目录 如何进行本地分支管理 Git进行分支管理 显示分支一览表 创建分支 转到新创建的分支 创建分支并转到新创建的分支 分支合并 删除分支 冲突合并 Tortoise进行分支管理 显示分支 创建分支 切换分支 分支合并 冲突合并 VS2
  • 绕过__chkesp堆栈检查

    前面很多注入相关的文章中都提到为了保证注入后原始程序能恢复正常的执行流 需要在编译器中关闭堆栈检查 为了解决问题 这是个好手段 但是不得不说这是回避问题 不是根本上解决问题 本文旨在解决这个问题 vs用 chkesp来实现堆栈检查 chke
  • 工业制造业亟需数字化转型,区块链可以发挥哪些价值?

    智能信息化技术驱动的第四次工业革命正推动制造业积极拥抱物联网 云计算等新技术进行数字化 智能化转型升级 制造业是一个纷繁复杂的庞大网络 不仅涉及机器 零件 产品等实体还有机器制造商 物流公司 销售等诸多利益相关方 在当今数字化时代中 如何帮
  • 如何防止小人对你的网站进行反向代理

    引言 如果是小站或者刚建立的站 则不用担心 但如果有名气了 便可能出现小人反代你的网站 做成所谓的 镜像站点 盗版站点 这篇文章就是介绍如何防止一些简单的反代小人 实施方法 一 使用 htaccess禁止反向代理 在站点根目录下新建 hta
  • android根据物理按键上下选中listview的item,回车进入点击相应事件

    最近做扫码枪程序 因应用于冷库 用户需求在列表选择上可以用上下键代替滑动 所以做了一个小demo 记录一下 话不多说 直接上代码 1 布局文件很简单 主界面 一个输入框一个列表 因为是手持采集枪 输入框经常用到 所以在做demo的时候也加上