Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SnapHelper项目位置_Java_Android_Android Recyclerview - Fatal编程技术网

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
中的元素数,并使用position
Integer.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) {
                ....
            }
        })