Simple Android RecyclerView example

前端 未结 11 1611
名媛妹妹
名媛妹妹 2020-11-22 02:03

I\'ve made a list of items a few times using Android\'s RecyclerView, but it is a rather complicated process. Going through one of the numerous tutorials online

11条回答
  •  猫巷女王i
    2020-11-22 02:54

    Minimal Recycler view ready to use Kotlin template for:

    • Vertical layout
    • A single TextView on each row
    • Responds to click events (Single and LongPress)

    I know this is an old thread and so are answers here. Adding this answer for future reference:

    Add a recycle view in your layout

        
    

    Create a layout to display list items (list_item.xml)

    
    
        
    
            
    
        
    
    
    

    Now create a minimal Adapter to hold data, code here is self explanatory

     class WifiAdapter(private val wifiList: ArrayList) : RecyclerView.Adapter() {
    
         // holder class to hold reference
        inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            //get view reference
            var ssid: TextView = view.findViewById(R.id.ssid) as TextView
        }
    
         override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
             // create view holder to hold reference
             return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false))
         }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            //set values
            holder.ssid.text =  wifiList[position].SSID
        }
    
        override fun getItemCount(): Int {
            return wifiList.size
        }
          // update your data
         fun updateData(scanResult: ArrayList) {
             wifiList.clear()
             notifyDataSetChanged()
             wifiList.addAll(scanResult)
             notifyDataSetChanged()
    
         }
     }
    

    Add this class to handle Single click and long click events on List Items

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
    
        public interface ClickListener {
            void onClick(View view, int position);
    
            void onLongClick(View view, RecyclerView recyclerView, int position);
    
        }
        private GestureDetector gestureDetector;
        private ClickListener clickListener;
    
        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }
    
                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child,recyclerView,  recyclerView.getChildPosition(child));
                    }
                }
            });
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildPosition(child));
            }
            return false;
        }
    
        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    
        }
    
        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
        }
    

    Lastly Set your adapter to Recycler View and add Touch Listener to start intercepting touch event for single or double tap on list items

        wifiAdapter = WifiAdapter(ArrayList())
    
        wifiList.apply {
            // vertical layout
            layoutManager = LinearLayoutManager(applicationContext)
            // set adapter
            adapter = wifiAdapter
    
            // Touch handling
            wifiList.addOnItemTouchListener(RecyclerTouchListener(applicationContext, wifiList, object : RecyclerTouchListener.ClickListener {
                override fun onClick(view: View?, position: Int) {
                    Toast.makeText(applicationContext, "RV OnCLickj " + position, Toast.LENGTH_SHORT).show()
                }
    
                override fun onLongClick(view: View, recyclerView: RecyclerView, position: Int) {
                    Toast.makeText(applicationContext, "RV OnLongCLickj " + position, Toast.LENGTH_SHORT).show()
                }
            }
            ))
        }
    

    Bonus ; Update Data

    wifiAdapter.updateData(mScanResults as ArrayList)
    

    Result:

提交回复
热议问题