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

posted @ 2021-04-13 11:47  AronJudge  阅读(70)  评论(0编辑  收藏  举报