2017-03-18 1 views
3


私は商品のリストにはRecyclerView、商品のリストにはSnapHelperを使用しています。アイデアは選択範囲をランダム化することで、ユーザーは画面をスワイプしたり、デバイスを振ったりしてランダムな位置にスクロールしています。
項目数は20ですが、RecyclerViewの要素数にはInteger.MAX_VALUEを使用し、位置はInteger.MAX_VALUE/2のRecyclerViewを初期化して何らかの無限リストを作成します。
デバイスの揺れのランダムな位置にスクロールするには、現在のスナップされたアイテムの位置を知る必要があります。
これを行う方法はありますか?ここでSnapHelper商品の位置

は私のフラグメントのコードです:

パブリッククラス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) { 

     } 
    }; 

} 

そして、ここでは、アダプタで拡張します

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

答えて

11

私はRecyclerViewを持っていたプロジェクトで、これを使用しました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 == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { 
       View centerView = snapHelper.findSnapView(mLayoutManager); 
       int pos = mLayoutManager.getPosition(centerView); 
       Log.e("Snapped Item Position:",""+pos); 
      } 
     } 
    }); 
+1

完璧、ありがとうございます!それについて考えなかった:)私の解決策は 'linearLayoutManager.findFirstCompletelyVisibleItemPosition();'、 'linearLayoutManager.findLastCompletelyVisibleItemPosition();'と の中間を見つけることでした。 –

+0

Perfect!ありがとうございました! –

+0

完璧な答え。私はまたそれを探していたhttps://stackoverflow.com/questions/48062571/android-how-to-setselection-the-spinner-from-recyclerview –

関連する問題