Android GridView之实现单元格合并,以及第一个item点击无响应或显示不正常的解决方案
2016-10-14 19:53
591 查看
个人觉得 GridView 中实现单元格合并的需求并不常见,但是这里还是介绍一种方法,先看一下效果图:
接下来是代码实现:
接下来再说一个不太常见的问题,在使用 GridView 时第一个 item 点击无响应或显示不正常,这种情况一般都是因为使用
了 BaseAdapter ,并且在重写 getView 方法时动态设置了 GridView 的宽度和高度。
解决方案:
首先检查 getView 方法中是否有动态设置 LayoutParams 的操作,如果有,那么 注意不能 new 一个新的LayoutParams ,而是
应该调用 getLayoutParams 获取已有的 LayoutParams 。如果 getLayoutParams 返回为空或者返回的 LayoutParams 不是
AbsListView.LayoutParams ,那么在 getView 之前使用 setLayoutParams 方法设置一下。
如果还有问题,那么检查是否采用了 ViewHolder 的写法,如果是则改成每次 getView 时都重新创建新的 View。
博主也遇到过这种问题,但是在使用了上面的方法排查后解决了问题,希望也可以解决你遇到的问题。
接下来是代码实现:
public class MainActivity extends Activity { private static GridView mGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGridView = new GridView(getApplicationContext()); MAdapter adapter = new MAdapter(mGridView.getContext(), new String[]{"item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10", "item11", "item12", "item13", "item14", "item15", "item16", "item17", "item18", "item19", "item20"}); mGridView.setAdapter(adapter); mGridView.setNumColumns(2); setContentView(mGridView); } class MAdapter extends BaseAdapter { private String[] items; private Context context; public MAdapter(Context context, String[] items) { this.items = items; this.context = context; } @Override public int getCount() { return items.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return super.getItemViewType(position); } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView; if (position % 4 == 0) { textView = new MyText(context); AbsListView.LayoutParams params = new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, 100); textView.setLayoutParams(params); textView.setTextColor(Color.BLACK); textView.setTextSize(20); textView.setText(items[position]); textView.setBackgroundColor(Color.GRAY); textView.setGravity(Gravity.CENTER); } else { textView = new TextView(context); AbsListView.LayoutParams params = new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, 200); textView.setLayoutParams(params); textView.setTextColor(Color.BLACK); textView.setTextSize(20); textView.setText(items[position]); textView.setVisibility(View.VISIB 4000 LE); if (position % 4 == 1) { AbsListView.LayoutParams params2 = new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, 100); textView.setLayoutParams(params2); textView.setVisibility(View.INVISIBLE); } textView.setGravity(Gravity.CENTER); } return textView; } class MyText extends TextView { public MyText(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int targetWidth = mGridView.getMeasuredWidth() - mGridView.getPaddingLeft() - mGridView.getPaddingRight(); widthMeasureSpec = MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.getMode(widthMeasureSpec)); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } }
接下来再说一个不太常见的问题,在使用 GridView 时第一个 item 点击无响应或显示不正常,这种情况一般都是因为使用
了 BaseAdapter ,并且在重写 getView 方法时动态设置了 GridView 的宽度和高度。
解决方案:
首先检查 getView 方法中是否有动态设置 LayoutParams 的操作,如果有,那么 注意不能 new 一个新的LayoutParams ,而是
应该调用 getLayoutParams 获取已有的 LayoutParams 。如果 getLayoutParams 返回为空或者返回的 LayoutParams 不是
AbsListView.LayoutParams ,那么在 getView 之前使用 setLayoutParams 方法设置一下。
如果还有问题,那么检查是否采用了 ViewHolder 的写法,如果是则改成每次 getView 时都重新创建新的 View。
博主也遇到过这种问题,但是在使用了上面的方法排查后解决了问题,希望也可以解决你遇到的问题。
相关文章推荐
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
- GridView设置Item高度,解决第一个item显示不正常以及事件不响应的问题
- 解决GridView动态设置宽高导致第一个item点击不响应或显示不正常问题
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
- Android GridView之添加分隔线,动态设置高度,实现高度自适应,并解决第一个item不显示的问题
- android listview嵌套gridview,并实现grid元素部分显示以及点击展开与折叠
- android的GridView的第一个item(图片)出现显示不正常(多出固定区域一部分蓝色边框)。解决方法
- [Android]在ListView嵌套GridView中出现的点击事件处理以及gridview显示不全的问题
- android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)
- Android圆盘菜单(修改了网络上现有的demo总是显示第一个的bug,以及增加了点击事件)
- listview嵌套gridview,并实现grid元素部分显示以及点击展开与折叠
- Android进阶——GridView实现可长按item显示可删除的小图标的UI
- Android GridView 第一个Item 点击没反应
- Android中GridView中Item点击背景图片的显示改变
- Android:GridView的item无法响应点击事件
- Android:GridView中实现点击Item变色,再点击还原。
- Android 在ListView嵌套GridView中出现的点击事件冲突的处理以及gridview显示不全的问题
- 关于在Android中如何点击GridView或者ListView中item子项达到修改子项背景的问题解决方案