android 关于GridView或ListView的item选中突现

有人说用selector,其实没这么简单,因为选中后要一直处于突现状态,并且选中其他item时要切换成选中的item为突现。

最初我是传递选中的position,然后去重绘View,然而在性能上不容乐观。

效果图:

主要代码:

 

import cn.qhg.dataadapter.ZbGridViewAdapter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 新增账本
 * 
 * @author qhg
 * @date 2014年3月19日
 * 
 */

public class ZbTypeAddFragment extends Fragment {
	private View view;
	private Button btn_back;
	private ImageView icon_mini;
	private TextView tv_zbNameAdd;

	private String zbName;
	private int miniIconResId;
	private GridView gView;
	private int iconResId = ZbGridViewAdapter.book_icon_array[0];

	public ZbTypeAddFragment(String zbName, int miniIconResId) {
		this.zbName = zbName;
		this.miniIconResId = miniIconResId;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		view = inflater.inflate(R.layout.zbtypeadd_fragment, container, false);
		btn_back = (Button) view.findViewById(R.id.btn_back);
		icon_mini = (ImageView) view.findViewById(R.id.iv_zbIconAdd);
		tv_zbNameAdd = (TextView) view.findViewById(R.id.tv_zbNameAdd);
		btn_back.setText("添加" + zbName);
		icon_mini.setBackgroundResource(miniIconResId);
		tv_zbNameAdd.setText(zbName);

		gView = (GridView) view.findViewById(R.id.gv_zbIconsAdd);
		gView.setSelector(new ColorDrawable(Color.TRANSPARENT));
		gView.setAdapter(new dataAdapter(0));
		gView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// 传递选中的position到adapter里去重绘GridView当前列的背景色
				gView.setAdapter(new dataAdapter(position));
				changeIcon(position);
			}
		});

		return view;
	}

	/**
	 * 新增账本
	 */
	public void AddZb() {
		Log.i("Other", zbName + "," + iconResId);
	}

	/**
	 * 选择不同的item显示不同的miniIcon
	 * 
	 * @param position
	 */
	public void changeIcon(int position) {
		iconResId = ZbGridViewAdapter.book_icon_array[position];
		icon_mini
				.setBackgroundResource(ZbGridViewAdapter.book_icon_array_mini[position]);
	}

	class dataAdapter extends BaseAdapter {

		private ViewHolder holder;
		private int position;

		public dataAdapter(int position) {
			this.position = position;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return ZbGridViewAdapter.book_icon_array.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return ZbGridViewAdapter.book_icon_array[position];
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (null == convertView) {
				Log.i("Other", "aaaa");
				holder = new ViewHolder();
				convertView = getActivity().getLayoutInflater().inflate(
						R.layout.zbtypeadd_gvzbitems_item, parent, false);

				holder.zbIcon = ((ImageView) convertView
						.findViewById(R.id.iv_zbAdd_Icon));
				holder.iv_zbAdd_SelectedStatus = (ImageView) convertView
						.findViewById(R.id.iv_zbAdd_SelectedStatus);
				holder.zbIcon
						.setBackgroundResource(ZbGridViewAdapter.book_icon_array[position]);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}

			if (this.position == position) {
				convertView.setBackgroundColor(Color.parseColor("#FFF8D7"));
				holder.iv_zbAdd_SelectedStatus.setVisibility(View.VISIBLE);
			} else {
				convertView.setBackgroundColor(Color.parseColor("#FFFFFF"));
				holder.iv_zbAdd_SelectedStatus.setVisibility(View.GONE);
			}
			return convertView;
		}
	}

	static class ViewHolder {

		ImageView zbIcon;

		ImageView iv_zbAdd_SelectedStatus;
	}
}

 

这样虽然能达到预期的效果,但每次都会去重绘GridView,在性能上是极差的。仔细看了一下onItemClick这个事件的参数,

AdapterView<?> parent   装载好了的View,也就是整个GridView

View view   当前选中的view,也就是item

int position   当前选中的item在GridView中的位置

long id   (暂无)

既然知道了整个AdapterView,也知道当前的选中位置和View,那么是不是可以直接在这里做突现切换呢,于是写了个循环来判断哪个item该突现。

 

			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// 传递选中的position到adapter里去重绘GridView当前列的背景色
				// gView.setAdapter(new dataAdapter(position));
				changeIcon(position);
				for (int i = 0; i < parent.getCount(); i++) {
					if (position == i) {// 当前选中的item改变背景色
						view.setBackgroundColor(Color.parseColor("#FFF8D7"));
					} else {
						// 获取未选中的item
						View v = parent.getChildAt(i);
						v.setBackgroundColor(Color.parseColor("#FFFFFF"));
					}
				}
			}

 


经过测试,选中不同的item进行突现切换时,并没有去重绘GridView。希望有更好的方法的朋友能不吝留言,谢谢!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要让 Android GridView 中的每个 item 的高度相同,你可以使用自定义的 GridViewAdapter 来实现。在适配器中,你可以设置每个 item 的布局,并通过设置布局的高度来实现相同的高度。 首先,在你的布局文件中定义一个 GridView,例如: ```xml <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="3" /> ``` 然后,创建一个自定义的适配器类,继承自 BaseAdapter,并实现 getView 方法。在 getView 方法中,你可以为每个 item 设置相同的高度。以下是一个示例: ```java public class GridViewAdapter extends BaseAdapter { private Context mContext; private List<String> mData; public GridViewAdapter(Context context, List<String> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View itemView; if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(mContext); itemView = inflater.inflate(R.layout.grid_item_layout, parent, false); } else { itemView = convertView; } // 设置每个 item 的高度 int height = calculateItemHeight(); // 计算每个 item 的高度 itemView.setLayoutParams(new GridView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height)); // 设置其他需要的内容 return itemView; } private int calculateItemHeight() { // 计算每个 item 的高度,例如根据屏幕宽度和列数来计算 int screenWidth = mContext.getResources().getDisplayMetrics().widthPixels; int columnCount = 3; int itemWidth = screenWidth / columnCount; int itemHeight = itemWidth; // 假设宽高比为1:1 return itemHeight; } } ``` 在上述代码中,你可以根据你的需求自定义每个 item 的布局,并在 getView 方法中设置每个 item 的高度。在 calculateItemHeight 方法中,你可以根据屏幕宽度和列数来计算每个 item 的高度。 最后,在你的 Activity 中设置适配器到 GridView: ```java GridView gridView = findViewById(R.id.gridView); GridViewAdapter adapter = new GridViewAdapter(this, dataList); gridView.setAdapter(adapter); ``` 其中,dataList 是你的数据列表,根据你的需求进行替换。 这样,你就可以实现 Android GridView 中每个 item 的相同高度了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值