zoukankan      html  css  js  c++  java
  • ListView

    Android ListView

    瀑布流的实现

    • 创建ListView

      • <LinearLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:orientation="vertical"
            xmlns:android="http://schemas.android.com/apk/res/android">
        
            <ListView
                android:id="@+id/Lv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </LinearLayout>
        

    • 给每一个Item(项目)创建布局

      • 给Item 加一个文本框

      • <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30dp"/>
        
    • 给Item设置数据

      • 创建一个Java bean类

      • public class Bean {
        
            String name;
        
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        }
        
    • 在 activity_main 通过for循环产生数据

      • private List<Bean> data = new ArrayList<>();
        
        for(int i=0;i<100;i++){
                    Bean bean = new Bean();
                    bean.setName("消息" + i);
                    data.add(bean);
                }
        
    • 拿到ListView 对象 ,准备操作ListView

      • ListView listView = findViewById(R.id.Lv);
        
    • 数据怎么填充到ListView? 有一个辅助类BaseAdaptor'

      • 四个方法

        • 获取总共的数目
        • 获取Item
        • 获取ItemId
        • 返回的View
      • public class MyAdapter extends BaseAdapter {
            @Override
            public int getCount() {
                return 0;
            }
            @Override
            public Object getItem(int position) {
                return null;
            }
            @Override
            public long getItemId(int position) {
                return 0;
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return null;
            }
        }
        
      • 首先把数据放进 Adaptor

        • 创建Adaptor的构造方法(存放数据,context放进去) 关于Context的知识点这里

          • public MyAdapter(List<Bean> data, Context context) {
                    this.data = data;
                    this.context = context;
                }
            
        • 添加data,this

          • listView.setAdapter(new MyAdapter(data,this));
            
        • 继续完善 adaptor

          • @Override
                public int getCount() {
                    return data.size();
                }
            @Override
                public long getItemId(int position) {
                    return position;
                }
            
          • getView 返回每一个Item 给它设值,并显示在界面上(重要方法)每显示一个 Item 就会调用以便 getView

            • public View getView
                  (int position, View convertView, ViewGroup parent)
              
            • 拿到Item的布局 给 convertView

              • convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
                
              • 滑动的时候 convertView 会复用,防止convertView不断创建,设置一个判断,为空才创建

                • if(convertView == null) {
                              convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
                          }
                  
                • 在 convertView 中拿到 textView

                • TextView textView = convertView.findViewById(R.id.tv);
                  
                • 把值传递到每一个Item的textView上面

                • textView.setText(data.get(poistion).getName())
                  
                • 然后 设置好的 converView

                • return convertView;
                  
        • 实现ListView点击

          • listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.e("leo","onItemClick"+position);
                }
            });
            
        • 优化

          • 每次在调用 getView的时候,都会去findViewbyId 找 textView,比较耗时

            • extView textView = convertView.findViewById(R.id.tv);
              
            • 创建 ViewHolder这个类 , listView 有几个子控件,就在这里面填充几个子控件

              • private final class ViewHolder{
                        TextView textView;
                    }
                
            • 在getView 里面创建 ViewHolder对象

              • if(convertView == null) {
                    viewHolder = new ViewHolder();
                    convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
                    viewHolder.textView = convertView.findViewById(R.id.tv);
                    convertView.setTag(viewHolder);
                }else {
                    viewHolder = (ViewHolder)convertView.getTag();
                }
                
                viewHolder.textView.setText(data.get(position).getName())
                

    Android RecycleView

    在build. gradle下添加Recycle 的依赖包

    implementtation    'androidx.recycleview:recycleview:1.1.0'
    

    创建Adapter 继承 Recyclerview.adaoter

    Public class Myadapter extends RecyclerView<MyAdapter.MyViewHolder>{}
    

    Recyle 必须使用 优化的ViewHolder控制子控件

    Recyleview 提供了 网格布局 和 瀑布流布局 ,网格对齐,瀑布流根据item大小自适应

  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/AronJudge/p/14652502.html
Copyright © 2011-2022 走看看