android帮我实现一个横向滑动选择控件,选中变色。给我生成代码
时间: 2024-02-21 20:57:25 浏览: 23
好的,以下是一个可以实现横向滑动选择、选中变色的自定义控件的代码:
```
public class HorizontalSelectView extends RecyclerView {
private SelectAdapter adapter;
private OnItemClickListener itemClickListener;
public HorizontalSelectView(Context context) {
super(context);
init();
}
public HorizontalSelectView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public HorizontalSelectView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
setLayoutManager(layoutManager);
adapter = new SelectAdapter(getContext());
setAdapter(adapter);
new LinearSnapHelper().attachToRecyclerView(this);
}
public void setDataList(List<SelectItem> dataList) {
adapter.setDataList(dataList);
}
public void setOnItemClickListener(OnItemClickListener listener) {
itemClickListener = listener;
}
private class SelectAdapter extends RecyclerView.Adapter<SelectViewHolder> {
private List<SelectItem> dataList;
private Context context;
public SelectAdapter(Context context) {
this.context = context;
dataList = new ArrayList<>();
}
public void setDataList(List<SelectItem> dataList) {
this.dataList = dataList;
notifyDataSetChanged();
}
@NonNull
@Override
public SelectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_select, parent, false);
return new SelectViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SelectViewHolder holder, int position) {
SelectItem item = dataList.get(position);
holder.textView.setText(item.getText());
holder.itemView.setSelected(item.isSelected());
}
@Override
public int getItemCount() {
return dataList.size();
}
}
private class SelectViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public SelectViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view);
itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
SelectItem item = adapter.dataList.get(position);
item.setSelected(true);
adapter.notifyItemChanged(position);
if (itemClickListener != null) {
itemClickListener.onItemClick(item);
}
}
}
});
}
}
public interface OnItemClickListener {
void onItemClick(SelectItem item);
}
public static class SelectItem {
private String text;
private boolean isSelected;
public SelectItem(String text) {
this.text = text;
}
public String getText() {
return text;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
}
```
这个控件继承了 RecyclerView,并在初始化时设置了横向的 LinearLayoutManager、自定义的 SelectAdapter 和 LinearSnapHelper。SelectAdapter 用于绑定数据和管理视图,SelectViewHolder 用于绑定 item 布局中的控件和设置点击监听器。另外,还定义了一个 SelectItem 类,用于保存选项的内容和状态。在 Activity 或 Fragment 中,你可以使用 setDataList() 方法设置数据源,使用 setOnItemClickListener() 方法设置选项的点击监听器。