最近做扫码枪程序,因应用于冷库,用户需求在列表选择上可以用上下键代替滑动,所以做了一个小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;
}
}
至此,功能算完成了