当前位置: 首页 > 面试题库 >

SnapHelper项目位置

狄晟睿
2023-03-14
问题内容

我正在使用垂直RecyclerView列出我的项目并SnapHelper捕捉中心项目。想法是随机选择,因此用户轻扫屏幕或摇动设备,然后滚动到随机位置。
项目数为20,但是我使用Integer.MAX_VALUE其中的元素数RecyclerView并使用位置初始化RecyclerView
Integer.MAX_VALUE / 2来创建某种无尽列表。
要滚动到设备晃动的随机位置,我需要知道当前捕捉的项目位置。
有什么办法吗?

这是我的片段代码

公共类PlaceListFragment扩展Fragment {

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) {

        }
    };

}

这是适配器:

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());
    }
}

问题答案:

我在具有RecyclerViewwith 的项目上使用了此功能SnapHelper,不确定是否是您想要的。

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);
            }
        }
    });


 类似资料:
  • 本文向大家介绍sharepoint项目。使用列表项目收集位置检索项目,包括了sharepoint项目。使用列表项目收集位置检索项目的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我想更改我的Android项目的设置,这样源代码就不会从[project_name]/app/src中获取,而是可以将其设置为从外部文件夹中获取。 项目结构原因是我想要共享我的src文件夹,所以我想在我的本地计算机上的Dropbox文件夹下定位。 有没有办法在Android Studio改变一个Android项目的SRC文件夹的路径?(在《月蚀》中,这是可能的) 以下是在Eclipse中如何完成的

  • 当我用SnapHelper将一个照片库实现为RecyclerView时,我有一个案例。有些照片(全屏宽度的照片)是“粘”在一起的。我想添加一些装饰,所以它在项目之间的空白,但只有当一个开始嘲笑否则我想要一张照片采取整个宽度。我试过: 在创建自定义装饰时,我设法将我的装饰画出屏幕,这样它就只显示在滚动上,但是当重写时,它是不可见的--隐藏在下一张照片下,而当我重写时,下一张照片的边缘在Divider

  • 我希望所有新项目都添加到顶部,即,如果采用ROW-ID 1、2、3,我添加了一个新项目,则应将其添加到位置1,其余项目应移动。但现在当我添加一个项目时,它会被添加到ID 4(即后面)。 方法 _ _ _

  • 在eclipse中显示以下错误: 不再支持此不推荐使用的功能。移除;您可以使用'lombok.anyconstructor.suppressConstructorProperties=true'创建lombok.config文件。 我创建了这个文件,但是在注释@AllArgsConstructor行之后,错误并没有消失。 我使用的是lombok版本,也尝试过版本,但问题相同。

  • 我正在使用recyclerview和水平线性布局管理器。我想改变recyclerview项目的颜色,当项目被捕捉到中间时。 所以我使用了LinearSnapHelper。 目前,之前拍摄的每件物品都保留了拍摄的背景色。所以,我做了一个全局变量SnapdPosition,并将其设置为0,所以默认情况下,recyclerview的第一项将被捕捉。 然后我在我的适配器的onBindViewHolder中