3.5、创建listview并通过Adapter注入数据

源码地址:https://github.com/ldy1993/ToolforAS.git

一、初步创建listView

我们首先在xml中创建一个listview控件,然后赋予id。

<?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"
    android:background="#ffffff">
<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>
</LinearLayout>

然后在activity中找到这个控件,然后使用setAdapter注入数据。

这里提示我们要填一个ListAdapter对象,我们选择后发现他是adapter的一个接口类,要实现太多方法了,按control+H,可以看到安卓给我们实现了几个子类。如下:

常用的是arrayAdapter,simpleAdapter,或者继承了baseAdapter的自定义adapter。

我们简单以arrayAdapter为例,

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_day7);
        ListView listView=findViewById(R.id.listView);
      //可以直接ArrayAdapter也可以ArrayAdapter<T>,安卓后面的版本加了范型,可以检测数据类型
        //ArrayAdapter录入参数如右(@NonNull Context context, @LayoutRes int resource,@IdRes int textViewResourceId, @NonNull List<T> objects)
        //resource:填资源文件id,为layout布局文件。里面放置条目的布局和控件
        //textViewResourceId,填写条目控件,对于arrayAdapter只能是textView。其他的adapter可以使用其他控件。
        //objects数据源
        ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,
                R.layout.activity_day7_listview_item,R.id.textView, new String[]{"这是第一条", "这是第二条"});
        listView.setAdapter(arrayAdapter);
    }

 R.layout.activity_day7_listview_item和R.id.textView如下

<?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"
    android:background="#ffffff">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="100sp"
        android:layout_gravity="center"
        android:gravity="center"
        android:textSize="50sp"></TextView>
</LinearLayout>

效果如下:

listView的点击事件和长按事件

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(Day7_Activity.this, "点击第"+position+"条", Toast.LENGTH_SHORT).show();
            }
        });
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(Day7_Activity.this, "长按第"+position+"条", Toast.LENGTH_SHORT).show();
                    //true处理该事件,false,不处理,传递给上一级
                return true;
            }
        });

二、自定义listView--使用baseAdapter

从上文,我们可以轻易的对listview进行长按或者点击。但是如果我们想要左滑呢。我们确实可以通过onTouch去判断坐标系移动确定是否左滑了。但是一般左滑都是伴随ui的变化,比如滑出一个删除按钮。对此如果使用仅仅只能用textview的arrayAdapter就不能满足要求了。我们需要自定义一个Adapter,然后往上面放可以左滑的自定义控件。然后在注入数据。

首先我们要先创建一个自定义控件,这个控件可以完成左滑功能。这个源码是在github上面clone下来的。因为我们里面要考虑逻辑和界面的调整比较繁琐,我没有浪费时间在上面,看的懂可以调整既可。现在基本要实现的自定义控件git上都有,下下来改一下即可。

然后准备好数据,自定义View加view里面需要的数据

里面需要填一个图片和标题,创建一个数据类存放。

然后创建一个 leftSlideAdapter继承baseAdapter。然后实现他的方法

 代码和注释如下


/**
 * ================================================
 * 作    者:刘东阳
 * 版    本:
 * 创建日期:2019/10/3
 * 描    述:
 * 修订历史:
 * ================================================
 */
public class leftSlideAdapter extends BaseAdapter {
    private ArrayList<leftSlideData> leftSlideDataList;
    private Context context;
    public leftSlideAdapter(Context context, ArrayList<leftSlideData> leftSlideDataList) {
        this.leftSlideDataList=leftSlideDataList;
        this.context=context;
    }

    //条目数量
    @Override
    public int getCount() {
        return leftSlideDataList.size();
    }
    //根据索引值返回该条目内容,可以不写
    @Override
    public Object getItem(int position) {
        return leftSlideDataList.get(position);
    }
    //获取条目id,可以不写
    @Override
    public long getItemId(int position) {
        return position;
    }
    //获取当前条目的布局效果。
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view=View.inflate(context, R.layout.activity_day7_baseadapter_item,null);
        TextView textView=view.findViewById(R.id.tv_name);
        textView.setText(leftSlideDataList.get(position).title);
        ImageView iv_icon=view.findViewById(R.id.iv_icon);
        iv_icon.setImageDrawable( leftSlideDataList.get(position).drawable);
        return view;
    }
}

通过mainactivity把上下文和数据类传进来,然后在getView中设置。

效果如下

三、listView的优化

优化一:复用convertView

convertView其实是消失在屏幕中的 View view=View.inflate(context, R.layout.activity_day7_baseadapter_item,null);返回的view;因此不可空时可以复用。

优化二:复用控件

findViewById去找控件。第一屏的时候,我们可以把控件放到容器中,然后绑定上面的convertView,然后下滑的时候不断的复用convertView,同时复用convertView绑定的容器,所以就无需在去findViewById去找控件

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder ;
        if(convertView==null) {
            convertView = View.inflate(context, R.layout.activity_day7_baseadapter_item, null);

            viewHolder =new ViewHolder();
            //将控件放到容器中
            viewHolder.textView = convertView.findViewById(R.id.tv_name);
            viewHolder.iv_icon = convertView.findViewById(R.id.iv_icon);
            //绑定到convertView中
            convertView.setTag("viewHolder");
        }
        else
        {
            //获取convertView中的容器
            viewHolder= (ViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(leftSlideDataList.get(position).title);
        viewHolder.iv_icon.setImageDrawable(leftSlideDataList.get(position).drawable);
        return convertView;
    }
    class  ViewHolder
    {
        TextView textView;
        ImageView iv_icon;
    }

下一节

安卓学习回顾与整理_(3.6、进度条ProgressBar)_day8

https://blog.csdn.net/u013636987/article/details/102067605

发布了39 篇原创文章 · 获赞 2 · 访问量 5020

猜你喜欢

转载自blog.csdn.net/u013636987/article/details/101988916
今日推荐