需求:在Android移植的arm板子上实现图片用GridView展示,只用键盘操作。OS:android2.2.1
问题:如果焦点从GridView上的一个Item移出,使GridView失去焦点,当焦点返回GridView时,如果第一个获得焦点的Item是上次最后移出那个Item此时不会触发OnItemSelectedListener中的onItemSelected事件.
测试代码:
Activity代码:
|
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView mGridView = (GridView) findViewById(R.id.gview);
mGridView.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(getBaseContext(), ""+arg2, Toast.LENGTH_SHORT)
.show();
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
BaseAdapter adapter = new BaseAdapter() {
public int getCount() {
return 6;
}
public Object getItem(int arg0) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView mImageView = new ImageView(MainActivity.this);
mImageView.setImageResource(R.drawable.icon);
return mImageView;
}
};
mGridView.setAdapter(adapter);
}
|
|
|
main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="horizontal"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Text1Text1"
android:focusable="true" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Text2Text2"
android:focusable="true" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Text3Text3"
android:focusable="true" />
</LinearLayout>
<GridView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/gview"
android:numColumns="4"></GridView>
</LinearLayout>
只用键盘操作确实会出现问题所述情况.
解决方法:
查看源代码中GridView有一个default的方法setSelectionInt第次做Item选择以后会记录下这个Item的postion.在焦点丢失时清空把这个置为-1就可以达到想要的目的.
添加如下代码:
mGridView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
try {
@SuppressWarnings("unchecked")
Class<GridView> c = (Class<GridView>) Class
.forName("android.widget.GridView");
Method[] flds = c.getDeclaredMethods();
for (Method f : flds) {
if ("setSelectionInt".equals(f.getName())) {
f.setAccessible(true);
f.invoke(v,
new Object[] { Integer.valueOf(-1) });
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
这样还是会存在一个问题,GridView默认的获得的焦点位置是0,如果焦点进入GridView,第0个Item得到焦点也不会触发ItemSelected事件,可以在加载完GridView的时候使用上面反射的代码清除默认焦点,达到预期效果。
分享到:
相关推荐
android Gridview分页实现的一个小例子
Android GridView 点击缩放图像
android gridview分页和滑动效
Android GridView使用例子
Android GridView完美横向滑动 ,并且可限制Gridview显示行数!
android gridview多选删除工程,支持同时选定多个item然后删除
Android GridView分组显示、带dock标题,带下拉刷新
android GridView 源代码 根据以下博客制作 http://blog.csdn.net/hellogv/article/details/4567095
一个非常好的 android gridview 异步加载图片的例子,需要17以上的api
android gridview adapter 实例 每个getview显示不同的数据
AndroidGridView点击每一个图片进入个人页面渐变特效.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
android gridview 上图下字
android GridView分组 convertview可重用 可用于 图片相册 日期分组 内存消耗低
android gridview 加载大量图片。无OOM。 程序运行默认加载SD卡内所有图片文件,这是我写了之后用在一款成熟app里面的。可用
Android GridView + ViewFlipper布局界面,模仿“机锋市场.rar
An Android GridView that can be configured to scroll horizontally or vertically. I should have posted this over a year and a half ago, but never got around to it. I needed a grid view that in portrait...
Android GridView,Gallery动态更新数据(整理自网络)
Android GridView 多标题分组显示,上下拉刷新,convertview可重用 效率高,不卡
Android GridView + ViewFlipper布局界面,模仿“机锋市场.