RecyclerView in the horizontal direction and recyclerview in the direction
Recently, a project needs to achieve horizontal slide of a card type, but it cannot slide with gestures. After clicking the button on the card, it slides to the next card, so I want to use RecyclerView to implement it, remove its gesture slide, click the button, and then the code controls the slide to the next card.
The next step is step-by-step implementation.
1. Introduce RecyclerView.
compile'com.android.support:recyclerview-v7:25.+'
2. Use RecyclerView in the layout file.
<android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent"/>
3. Create the item layout file for RecyclerView.
<? Xml version = "1.0" encoding = "UTF-8"?> <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientation = "vertical"> <LinearLayout android: layout_width = "wrap_content" android: layout_height = "match_parent" android: layout_gravity = "center" android: gravity = "center" android: orientation = "vertical"> <TextView android: id = "@ + id/item_text" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "test" android: textColor = "@ android: color/black "android: textSize =" 36sp "/> <Button android: id =" @ + id/item_button "android: layout_width =" wrap_content "android: layout_height = "wrap_content" android: layout_marginTop = "36dp" android: text = "next page" android: textSize = "24sp"/> </LinearLayout>
4. Implement RecyclerViewAdapter.
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerHolder> { private static final String TAG = RecyclerViewAdapter.class.getSimpleName(); private List<String> dataList; private Context mContext; private RecyclerView recyclerView; public RecyclerViewAdapter(Context context, List<String> dataList) { mContext = context; this.dataList = dataList; } @Override public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.recycler_item_view, parent, false); RecyclerHolder holder = new RecyclerHolder(view); return holder; } @Override public void onBindViewHolder(RecyclerHolder holder, final int position) { holder.textView.setText(dataList.get(position)); if (position == dataList.size() - 1) { holder.button.setVisibility(View.GONE); } holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { recyclerView.smoothScrollToPosition(position + 1); } }); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); this.recyclerView = recyclerView; } @Override public int getItemCount() { return dataList.size(); } public class RecyclerHolder extends RecyclerView.ViewHolder { TextView textView; Button button; public RecyclerHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.item_text); button = (Button) itemView.findViewById(R.id.item_button); } }}
5. Set RecyclerView in the activity file.
private RecyclerView recyclerView; private LinearLayoutManager mRecyclerViewLayoutManager; private RecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycler); List<String> datas = new ArrayList<>(); datas.add("LiMing"); datas.add("XiaoMing"); datas.add("HanMeiMei"); mRecyclerViewLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(mRecyclerViewLayoutManager); adapter = new RecyclerViewAdapter(this, datas); recyclerView.setAdapter(adapter); }
6. Set RecyclerView to horizontal.
mRecyclerViewLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
7. Do not move with gestures.
recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; }});
However, there is a problem. When the item slides, click it and the item will be paused and no longer slide.
At this time, we need to deal with this problem. During the Sliding Process of items, we do not intercept click events, or intercept click events when they do not slide.
// Position is the ID of the item in RecyclerView. RecyclerView. setOnTouchListener (new View. onTouchListener () {@ Override public boolean onTouch (View v, MotionEvent event) {Log. d (TAG, "position =" + RecyclerViewAdapter. position); if (isScroll) {recyclerView. smoothScrollToPosition (RecyclerViewAdapter. position); return false;} else {return true ;}}); recyclerView. addOnScrollListener (new RecyclerView. onScrollListener () {@ Override public void onScrollStateChanged (RecyclerView recyclerView, int newState) {super. onScrollStateChanged (recyclerView, newState); if (newState = 2) {isScroll = false;} if (newState = 1) {isScroll = true;} if (newState = 0) {isScroll = false ;}}@ Override public void onScrolled (RecyclerView recyclerView, int dx, int dy) {super. onScrolled (recyclerView, dx, dy) ;}}); @ Override protected void onDestroy () {Log. d (TAG, "onDestroy ()"); position = 0; super. onDestroy ();}
Complete Project Code address: Https://github.com/ZhangMiao147/HorizontalRecyclerView