对于列表recyclrview中item的高亮处理

对于列表高光的处理,主要是在绑定数据的时候,对于所点击的位置上进行颜色的改变,同时复习了recyclerview点击监听的使用,对于长按监听同样适用。

adapter.Java的使用

public class SettingRcycleviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//mList中存放的是item中的控件,用于封装item中元素,mMyItemOnClickListener用于监听的作用
	List<SettingSideFragment.SideItem> mList;
	private MyItemOnClickListener mMyItemOnClickListener;
	public SettingRcycleviewAdapter(List<SettingSideFragment.SideItem> list) {
		mList = list;
	}


	//create every view , use recyclerview.viewHolder
	@NonNull
	@Override
	public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
	//加载布局文件
		View view2 = LayoutInflater.from(parent.getContext()).
				inflate(R.layout.setting_side_fragment_recyclerview, parent, false);
		return new MyOneViewHolder(view2, mMyItemOnClickListener);
	}
//其中MyOneViewHolder为自定义的viewholder
	//暴露接口
	public void setItemOnClickListener(MyItemOnClickListener listener) {
		mMyItemOnClickListener = listener;

	}


	//data and view to bind,绑定数据
	@SuppressLint("ResourceAsColor")
	@Override
	public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
		if (holder !=null){
			//列表中的元素text
			((MyOneViewHolder) holder).topic.setText(mList.get(position).getTitle());
			//改变item的颜色监听
			holder.itemView.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					//自定义中已经加载了点击的操作
					((MyOneViewHolder) holder).onClick(v);
					//更新
					notifyDataSetChanged();
				}
			});
			/*对于item颜色的修改,其中想要注意的是setBackgroundResource(int id)
			和setBackgroundcolor(color)两个方法的使用,可以查找Android自带的源码进行操作*/
			if (position == getmPosition()) {
				holder.itemView.setBackgroundResource(R.color.item_color);
			}else holder.itemView.setBackgroundColor(0);
			//对于不需要修改的列表使用holder.itemView.setBackgroundColor(0)即可实现
		}
	}
	@Override
	public int getItemCount() {
		return mList.size();
	}

	public class MyOneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
		private TextView topic;
		private MyItemOnClickListener mListener;
		//实现接口
		public MyOneViewHolder(View itemView, MyItemOnClickListener myItemOnClickListener) {
			super(itemView);
			topic = itemView.findViewById(R.id.setting_topic);
			this.mListener = myItemOnClickListener;
			itemView.setOnClickListener(this);
		}

		@Override
		public void onClick(View v) {
			if (mListener != null)
				mListener.onItemClick(v, getLayoutPosition());
		}
	}
	//定义接口
	public interface MyItemOnClickListener {
		void onItemClick(View view, int position);
	}
	
	/*便于知道点击item的位置,初始化为-1是用于未点击时不会出现亮光的效果,
	不然初始化为0的话则会出现位置为0的地方出现亮光*/
	private int mPosition = -1;
	public int getmPosition(){
		return mPosition;
	}
	public void setmPosition(int mPosition){
		this.mPosition = mPosition;
	}

}

fragment.java的使用

public class SettingSideFragment extends Fragment {
	private final static String TAG = "SettingSideFragment";
	private SettingRcycleviewAdapter mAdapter;
	private SettingListener myListener;
	private List<SideItem> mSideItems = new ArrayList<SideItem>();

	@Nullable
	@Override
	public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.setting_side_fragment, container, false);
		RecyclerView mRecyclerView = view.findViewById(R.id.side_recyclerview);
		mRecyclerView.setLayoutManager(new LinearLayoutManager((SettingActivity) getActivity()));
		indata();
		mAdapter = new SettingRcycleviewAdapter(mSideItems);
		mRecyclerView.setAdapter(mAdapter);
		//实现item监听效果
		mAdapter.setItemOnClickListener(new SettingRcycleviewAdapter.MyItemOnClickListener() {
			@Override
			public void onItemClick(View view, int position) {
				//监听
				myListener.onSettingListener(mSideItems.get(position));
				mAdapter.setmPosition(position);
				Log.i(TAG, "onItemClick: " + position);
				//更新
				mAdapter.notifyDataSetChanged();

			}
		});
		return view;
	}

	//重写并绑定activity的回调方法
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		try {
			myListener = (SettingListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
		}

	}
//数据加载
	private void indata() {
	//用于获取在value中的数据,便于封装,数据变换后不需要修改代码
		Resources resources = getContext().getResources();
		String[] titles = resources.getStringArray(R.array.side_fragment_titles);
		String[] targets = resources.getStringArray(R.array.side_fragment_targets);
		//初始化
		for (int i = 0; i < titles.length; i++) {
			SideItem item = new SideItem(titles[i], targets[i]);
			mSideItems.add(item);
		}
	}

	//回调接口
	public interface SettingListener {
		void onSettingListener(SideItem item);
	}
//封装item的数据,实现点击item就携带fragment的数据
	public static class SideItem {
		private String mTitle;
		private String mTargetFragment;
		SideItem(String mTitle, String mTargetFragment) {
			this.mTitle = mTitle;
			this.mTargetFragment = mTargetFragment;
		}
		public String getTitle() {
			return mTitle;
		}
		public String getTargetFragment() {
			return mTargetFragment;
		}

	}
}

在实验过程中,对于recyclerview的使用更加的熟练,对于一个item中存在多个样式时使用preference进行处理会更加方便,也能够保存数据。recyclerview中 对于高亮的处理和listview比较类似,对于列表的处理,比较重要是使列表高内聚低耦合,在修改activity中的数据能够不影响列表内部控件,列表内部控件的处理也不会造成过多的代码重写。

原则1:学习Android中的封装性
原则2:代码保持高内聚低耦合
原则3:不断完善自身代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值