专栏首页KK的小酒馆Adapter与ListView的简单应用(下)Android应用界面开发

Adapter与ListView的简单应用(下)Android应用界面开发

Android应用界面开发

第二章学习

第二部分####


1.继续分析Adapter的常用类 上一篇文章使用了ArrayAdapte制作了一个只由简单的文字组成的ListView,那ArrayAdapter是不是只有简单显示一行文字的功能呢?答案是否定的。

public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {...}

发现,既然ArrayAdapter是接受泛型的,那其实什么样的类都能传给它,并且它继承自BaseAdapter,可使用的方法很多。

包含泛型List的构造方法:

 public ArrayAdapter(Context context, int resource, List<T> objects)

其它上一篇都说了,这次不使用数组,而使用一个泛型集合List< T > objects,并且去掉了一个构造参数int textViewResourceId (也就是textView的ID),这次不只针对单行的文本,所以只有这个参数不够用呀,你当然也可以填满4个参数,默认值就为0,表示无。

ListView01

自己思考后,画了2张图,原创的!

其实,在数据源中每一个object(包含各种Java类),在ListView中对应着每一个item(列表中的每一个横行)

ListView02

而Java类中的对应的变量,则可以一 一对应与item布局文件中的各个属性。 来,编代码,存在一个Data类,表示每一个Item包含的内容。

public class Data {
 private String Text; //需要显示的文字
 private int ImageId; //需要显示的图片资源编号

 public Data(String text, int imageId) {
 Text = text;
 ImageId = imageId;
 }
 public String getText() {
 return Text;
 }
 public int getImageId() {
 return ImageId;
 }
}

接下来需要编写一个自定义ArrayAdapter< Data >类,用于处理Data变量与控件属性的关系。

public class DataAdapter extends ArrayAdapter<Data> {
 int mResourceId;

 public DataAdapter(Context context, int resource, List<Data> objects) {
 super(context, resource, objects); //调用ArrayAdapter的构造方法
 mResourceId = resource; //获取list的布局文件
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 //重写getView方法
 Data mData = getItem(position);
 //获取此Data
 ViewHolder mViewHolder;
 if (convertView == null){
 //如果view未被创建过,且缓存为空
 mViewHolder = new ViewHolder();
 convertView= LayoutInflater.from(getContext()).inflate(mResourceId,null);
 //此时,将mResourceId转换成了View类
 /*其实LayoutInflater.from(Context context)方法,就是包含下列参数的静态方法
 /LayoutInflater LayoutInflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 获得了系统的布局解析服务*/
 //inflate的第一个参数是布局文件Id,第二个ViewGroup对象,在创建单独的view的时候,只需要填null

 mViewHolder.textView = (TextView)convertView.findViewById(R.id.textView);
 mViewHolder.image = (ImageView) convertView.findViewById(R.id.image);
 //通过convertView找到其中的控件

 convertView.setTag(mViewHolder);
 //将ViewHolder类存储到已经实例化的convertView中
 }else {
 //如果convertView有值
 mViewHolder = (ViewHolder) convertView.getTag();
 //从convertView中拿到ViewHolder类,从而可以使用其中的对象
 }
 mViewHolder.textView.setText(mData.getText());
 mViewHolder.image.setImageResource(mData.getImageId());
 //通过实例化后的Data数据,获取相应函数,进行属性的赋值

 return convertView;
 }
 class ViewHolder{
 //创建一个类,用于保存实例化的对象

 TextView textView;
 ImageView image;
 }
}

其中position是item的顺序编号,此编号与List< Data>中的Data位置相同

其它不难理解,在其中创建了一个内部类ViewHolder,因为调用getview方法时,不需要每次都创建textView等属性的实例,只需要第一次创建时,将实例创建在ViewHolder内部;利用View的setTag方法,可将一些类型的实例存储于其中,并随着view的传递而传递,在需要使用是,利用getTag方法取出。

贴上剩下的代码 Class FirstAty

public class FirstAty extends AppCompatActivity {

 private ArrayList<Data> mList;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_first_aty);

 initData();
 //初始化数据

 DataAdapter DataAdapter = new DataAdapter(FirstAty.this,R.layout.list_layout,mList);
 //实例化适配器

 ListView listView = (ListView) findViewById(R.id.list_view);
 //通过id实例化ListView

 listView.setAdapter(DataAdapter);
 //关联listView与适配器

 }

 private void initData() {
 mList = new ArrayList<>();//创建数据源的容器
 mList.add(new Data("camera",R.drawable.camera));
 mList.add(new Data("games_control",R.drawable.games_control));
 mList.add(new Data("ringtone",R.drawable.ringtone));
 mList.add(new Data("settings",R.drawable.settings));
 mList.add(new Data("speech_balloon",R.drawable.speech_balloon));
 }
}

activity_first_aty.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:gravity="center_horizontal" 
 tools:context="comeinsteinford.github.firstapplication.FirstAty">

 <ListView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/list_view">
 </ListView>

</RelativeLayout>

list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="horizontal"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <ImageView
 android:layout_width="70dp"
 android:layout_height="70dp"
 android:id="@+id/image"
 android:contentDescription="@string/text01"
 android:padding="10dp"/>
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textSize="30sp"
 android:id="@+id/textView"
 android:padding="10dp"/>
</LinearLayout>

这几个代码基本上也没变,我只是在工程目录下放置了一些图片,用于listview中显示,当然Data类与list_layout中的控件是一一对应的,可以添加其它两边都可适配的各类控件及属性。

运行效果如下

运行效果

文章太长容易让人看不下去,今天就到这里吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第一个Android应用Android应用界面开发

    给项目取名First Application 主界面命名FirstAty,xml文件命名就自动使用activity_first_aty吧。

    爱因斯坦福
  • Service的跨进程开发Android开发高级进阶

    Service的跨进程通信主要由两种Android提供的方法进行,一个是AIDL,通过创建一个AIDL文件来完成,另一个是利用Messenger,发送Messa...

    爱因斯坦福
  • Adapter与ListView的简单应用(上)Android应用界面开发

    所谓适配器,是一个在“用户界面”View和“数据模型”Model之间的"控制器"Controller

    爱因斯坦福
  • TableLayout实现均匀布局(条目横向1:1排列)

    像下面的布局效果,我们经常使用LinearLayout实现,其实也可以使用TableLayout去简单的实现

    夏洛克的猫
  • android 中使用TableLayout实现表单布局效果示例

    砸漏
  • Android仿淘宝购物车,玩转电商购物车

    用户2032165
  • Android实现为GridView添加边框效果

    2.设置GridView item的背景: grid_selector.xml文件

    砸漏
  • ImageSwitcher和TextSwitcher

    上一期我们了解了ViewAnimator组件和ViewSwitcher组件的使用,你都掌握了吗?本期一起来学习ViewSwitcher的两个子组件Imag...

    分享达人秀
  • android galley实现画廊效果

    今天在做一个软件界面时用到了ImageSwitcher和Gallery控件,在看API时,感觉上面的例子讲的不是很具体,效率并不高。在这里我就以一个图片浏览功能...

    xiangzhihong
  • Android中自定义Toast

    在Android程序中,Toast可谓用处多多,Toast本身作为消息提示,不占用焦点,用户可以处理其他程序的同时接收Toast中显示的信息。但是我们平常看见的...

    指点

扫码关注云+社区

领取腾讯云代金券