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>