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大小自适应

  • 相关阅读:
    DFS染色解决区域分块问题UVALive 6663
    栈之逆波兰
    线段树总结
    区间合并问题
    线段树的开闭区间问题
    离散化
    线段树的学习过程
    BFS的小结
    状态数组哪家强
    卡特兰数。
  • 原文地址:https://www.cnblogs.com/AronJudge/p/14652502.html
Copyright © 2011-2022 走看看