item布局及元素监听

item布局中的元素的监听

技巧:控件在哪里初始化就在那里设置监听即可,item中的元素显示次数不定所以点击时不能直接用id来区分,二十需要使用位置来区分,可以借助view中的
setTag设置标记方法将每个位置标记到视图中

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (null == convertView) {
        convertView = mInflater.inflate(R.layout.item_music_layout, null);
        holder = new ViewHolder();
        holder.tvName = (TextView) convertView.findViewById(R.id.item_name);
        holder.btnExpand = (Button) convertView
        .findViewById(R.id.item_expand);
        holder.itemMenuLayout = convertView
        .findViewById(R.id.item_expand_layout);
        // 设置按钮的点击监听
        holder.btnExpand.setOnClickListener(btnExpandClick);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.tvName.setText(musics[position]);
    // 显示前将当前显示的下标标记到按钮上,以便于按钮被点击时可以得到下标位置
    holder.btnExpand.setTag(position);
    // 检测用户点击的位置跟显示的位置是不是同一个位置,是则显示菜单
    if (clickPos == position) {
    holder.itemMenuLayout.setVisibility(View.VISIBLE);
    } else {
        holder.itemMenuLayout.setVisibility(View.GONE);
    }
    return convertView;
}
class ViewHolder {
    TextView tvName;
    Button btnExpand;
    View itemMenuLayout; // 隐藏的菜单区域
}
    监听的处理,可以结合view的标记来获取位置区分元素
private OnClickListener btnExpandClick = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // 从按钮上获取下标
        int pos = (Integer) v.getTag();
        clickPos = pos;
        notifyDataSetChanged(); // 刷新适配器
    }
};

item布局中如果使用了Button、CheckBox、RadioButton、EdiText、ImageButton,那么这些控件会主动抢走焦点,会导致item监听不到OnItemClick以及
onItemLongClick,所以可以在item跟布局上使用android:descendantFocusability属性处理焦点问题

android:descendantFocusability="blocksDescendants"
beforeDescendants表示item布局优先于孩子得到焦点
afterDescendants表示孩子会优先于item布局得到焦点
blocksDescendants按照各个视图覆盖区域得到焦点(按块划分)
关于sd卡

sd卡在系统中有挂载状态,一般挂载才可以访问其内容,检测是否挂载如下:

if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
...
}

如果sd卡是挂载的可以使用Environment获取sd卡跟路径

// sd卡跟目录
currentFolder = Environment.getExternalStorageDirectory().toString();
GridView
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="10dp" item之间的水平间距
android:numColumns="3" 列数
android:verticalSpacing="10dp" item之间垂直间距
android:stretchMode="columnWidth" 伸缩模式, columnWidth按照列宽伸缩间距不变,
                                            SpacingWidth按照间距伸缩列宽布标
android:columnWidth="100dp" > 设置列宽
</GridView>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值