对于列表高光的处理,主要是在绑定数据的时候,对于所点击的位置上进行颜色的改变,同时复习了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:不断完善自身代码