Java SnapHelper项目位置
Java SnapHelper项目位置,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在使用垂直RecyclerView列出我的项目,并使用SnapHelper捕捉中心项目。其想法是随机选择,所以用户滑动屏幕或摇动设备,设备就会滚动到随机位置 项目数为20,但我使用Integer.MAX\u VALUE表示RecyclerView中的元素数,并使用positionInteger.MAX\u VALUE/2初始化RecyclerView以创建某种无止境列表 要在设备上滚动到随机位置,我需要知道当前抓拍的项目位置 有什么办法吗 这是我的片段代码: 公共类PlaceListFrag
我正在使用垂直
RecyclerView
列出我的项目,并使用SnapHelper
捕捉中心项目。其想法是随机选择,所以用户滑动屏幕或摇动设备,设备就会滚动到随机位置项目数为20,但我使用
Integer.MAX\u VALUE
表示RecyclerView
中的元素数,并使用positionInteger.MAX\u VALUE/2
初始化RecyclerView以创建某种无止境列表要在设备上滚动到随机位置,我需要知道当前抓拍的项目位置
有什么办法吗 这是我的片段代码: 公共类PlaceListFragment扩展了片段{
private static final String TAG = "PlaceListFragment";
public static final String ARG_KEY1 = "key1";
private ArrayList<PlaceItem> places;
private RecyclerView recyclerView;
private SensorManager sensorManager;
private float accelValue;
private float accelLast;
private float shake;
SnapHelper snapHelper;
Vibrator vibe;
public static PlaceListFragment newInstance() {
Bundle args = new Bundle();
PlaceListFragment fragment = new PlaceListFragment();
fragment.setArguments(args);
return fragment;
}
public static PlaceListFragment newInstance(ArrayList<PlaceItem> places) {
Bundle args = new Bundle();
args.putParcelableArrayList(PlaceListActivity.KEY_PLACES, places);
PlaceListFragment fragment = new PlaceListFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
places = getArguments().getParcelableArrayList(PlaceListActivity.KEY_PLACES);
accelValue = SensorManager.GRAVITY_EARTH;
accelLast = SensorManager.GRAVITY_EARTH;
shake = 0.00f;
vibe = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_place_list, container, false);
recyclerView = (RecyclerView) v.findViewById(R.id.place_list);
snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.setOnFlingListener(snapHelper);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(new PlaceListAdapter(getActivity(), places));
recyclerView.scrollToPosition(PlaceListAdapter.MIDDLE);
sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(sensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
return v;
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
accelLast = accelValue;
accelValue = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = accelValue - accelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
vibe.vibrate(200);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}
private static final String TAG=“PlaceListFragment”;
公共静态最终字符串ARG_KEY1=“KEY1”;
私人ArrayList场所;
私人回收站;
私人传感器管理器传感器管理器;
私人价值;
私人漂浮物;
私人浮动震动;
SnapHelper SnapHelper;
振动器振动;
公共静态PlaceListFragment newInstance(){
Bundle args=新Bundle();
PlaceListFragment=新的PlaceListFragment();
fragment.setArguments(args);
返回片段;
}
公共静态PlaceListFragment新实例(ArrayList位置){
Bundle args=新Bundle();
args.putParcelableArrayList(PlaceListActivity.KEY_PLACES,PLACES);
PlaceListFragment=新的PlaceListFragment();
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
d(标记“onCreate()”);
super.onCreate(savedInstanceState);
places=getArguments().getParcelableArrayList(PlaceListActivity.KEY\u places);
accelValue=SensorManager.GRAVITY\u接地;
accelLast=SensorManager.GRAVITY\u EARTH;
震动=0.00f;
vibe=(可控震源)getActivity().getSystemService(Context.可控震源服务);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(R.layout.fragment\u place\u list,container,false);
recyclerView=(recyclerView)v.findViewById(R.id.place\u列表);
snapHelper=新的LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.setOnFlingListener(snapHelper);
setLayoutManager(新的LinearLayoutManager(getContext());
setAdapter(新的PlaceListAdapter(getActivity(),places));
recyclerView.scrollToPosition(PlaceListAdapter.MIDDLE);
sensorManager=(sensorManager)getActivity().getSystemService(Context.SENSOR\u服务);
sensorManager.registerListener(sensorListener,sensorManager.getDefaultSensor(Sensor.TYPE\u Accelerator),sensorManager.Sensor\u DELAY\u NORMAL);
返回v;
}
@凌驾
恢复时公开作废(){
super.onResume();
}
@凌驾
公共无效暂停(){
super.onPause();
}
私有最终SensorEventListener sensorListener=新的SensorEventListener(){
@凌驾
传感器更改时的公共无效(传感器事件){
float x=事件值[0];
浮动y=事件值[1];
float z=事件值[2];
accelLast=accelValue;
accelValue=(float)Math.sqrt((double)(x*x+y*y+z*z));
浮动增量=加速度值-加速度上次;
震动=震动*0.9f+增量;
如果(抖动>12){
振动(200);
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
}
};
}
下面是适配器:
public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.PlaceAdapterHolder> {
private final FragmentActivity context;
public static final int HALF_MAX_VALUE = Integer.MAX_VALUE/2;
public static int MIDDLE;
private List<PlaceItem> placeItems;
public static class PlaceAdapterHolder extends RecyclerView.ViewHolder {
private ImageView image;
private TextView textMain;
private TextView textRating;
public PlaceAdapterHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.icon);
textMain = (TextView) itemView.findViewById(R.id.txt_main_line);
textRating = (TextView) itemView.findViewById(R.id.txt_right_field);
}
public void bindPlace(PlaceItem placeItem) {
String placeName = placeItem.getName() == null? "?":placeItem.getName();
String firstLetter = placeName.substring(0, 1);
ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT
int color = generator.getColor(placeName);
TextDrawable drawable = TextDrawable.builder()
.beginConfig()
.toUpperCase()
.endConfig()
.buildRect(firstLetter, color);
image.setImageDrawable(drawable);
textMain.setText(placeItem.getName());
textRating.setText(placeItem.getRating());
}
}
public PlaceListAdapter(FragmentActivity context, List<PlaceItem> placeItems) {
this.context = context;
this.placeItems = placeItems;
MIDDLE = HALF_MAX_VALUE - HALF_MAX_VALUE % placeItems.size();
}
@Override
public PlaceListAdapter.PlaceAdapterHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.place_list_one_line_item, parent, false);
return new PlaceAdapterHolder(view);
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
@Override
public void onBindViewHolder(PlaceListAdapter.PlaceAdapterHolder holder, final int position) {
final PlaceItem placeItem = getItem(position);
holder.bindPlace(placeItem);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fm = context.getSupportFragmentManager();
PlaceDetailsFragment dialog = PlaceDetailsFragment.newInstance(getItem(position));
dialog.show(fm, "DETAILS_DIALOG");
}
});
}
private PlaceItem getItem(int position)
{
return placeItems.get(position % placeItems.size());
}
}
公共类PlaceListAdapter扩展了RecyclerView.Adapter{
私有最终碎片活动上下文;
公共静态final int HALF_MAX_VALUE=Integer.MAX_VALUE/2;
公共静态int-MIDDLE;
私人物品清单;
公共静态类PlaceAdapterHolder扩展了RecyclerView.ViewHolder{
私有图像查看图像;
私有TextView textMain;
私有文本视图文本评级;
公共场所适配器文件夹(查看项目视图){
超级(项目视图);
image=(ImageView)itemView.findViewById(R.id.icon);
textMain=(TextView)itemView.findViewById(R.id.txt\u main\u行);
textRating=(TextView)itemView.findViewById(R.id.txt\u right\u字段);
}
公共空白绑定位置(PlaceItem PlaceItem){
字符串placeName=placeItem.getName()==null?“:placeItem.getName();
String firstLetter=placeName.substring(0,1);
ColorGenerator=ColorGenerator.MATERIAL;//或使用默认值
int color=generator.getColor(placeName);
TextDrawable-drawable=TextDrawable.builder()
.begincofig()
.toUpperCase()
.endConfig()
.buildRect(第一个字母,颜色);
image.setImageDrawable(可绘制);
textMain.setText(placeItem.getName());
setText(placeItem.getRating());
}
}
公共PlaceListAdapter(FragmentActivity上下文,列表placeItems){
this.context=上下文;
this.placeItems=placeItems;
MIDDLE=HALF_MAX_VALUE-HALF_MAX_VALUE%placeItems.size();
}
@凌驾
public PlaceListAdapter.PlaceAdapterHolder onCreateViewHolder(视图组父级,int-viewType){
最终视图=LayoutInflater.from(parent.getContext()).flate(R.layout.place\u list\u one\u line\u item,parent,false);
返回新的PlaceAdapterHolder(视图);
}
@凌驾
public int getItemCount(){
返回Integer.MAX_值;
}
@凌驾
BindViewHolder上的公共void(PlaceListAdapter.PlaceAdapterHolder,最终int位置){
最终地点项目地点项目=getItem(位置);
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new DemoSlidesAdapter(getApplicationContext());
mRecyclerView.setAdapter(mAdapter);
final SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState == RecyclerView.SCROLL_STATE_IDLE) {
View centerView = snapHelper.findSnapView(mLayoutManager);
int pos = mLayoutManager.getPosition(centerView);
Log.e("Snapped Item Position:",""+pos);
}
}
});
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
val centerView = snapHelper.findSnapView(mLayoutManager)
val pos = mLayoutManager.getPosition(centerView!!)
if (newState == RecyclerView.SCROLL_STATE_IDLE || (pos == 0 && newState == RecyclerView.SCROLL_STATE_DRAGGING)) {
Log.d("BINDING", "positionView SCROLL_STATE_IDLE: $pos")
}
}
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener(){
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
....
}
})