Adapter适配器

Adapter是连接后端数据和前端显示的适配器接⼝,是数据和UI(View)之间⼀个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。

一.项目效果

1.1 ArrayAdapter效果

1.2 SimpleAdapter效果

1.3 BaseAdapter效果 

 二.实现过程

2.1 ArrayAdapter实现

2.1.1 创建ArrayListActivity⻚⾯

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.ArrayListActivity">

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

 2.1.2ArrayAdapter代码实现

package com.example.listview.ui;

import android.os.Bundle;

import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.listview.R;

import java.util.ArrayList;
import java.util.List;

public class ArrayListActivity extends AppCompatActivity {
    private ListView listView;
    private List<String> stringList;

    private ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_array_list);
        listView = findViewById(R.id.araryListView);

        stringList = new ArrayList<>();

        for (int i = 0; i < 50; i++) {
            stringList.add("List_view"+i);
        }

        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stringList);

        listView.setAdapter(arrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(ArrayListActivity.this, stringList.get(position), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

2.2 SimpleAdapter实现

2.2.1 SimpleActivity⻚⾯

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.SimpleActivity">
    <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/simpleAdapterListView"/>
</LinearLayout>

2.2.2 SimpleAdapter代码实现

package com.example.listview.ui;

import android.os.Bundle;

import android.widget.ListView;
import android.widget.SimpleAdapter;
import androidx.appcompat.app.AppCompatActivity;
import com.example.listview.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleActivity extends AppCompatActivity {
    private ListView listView;
    private List<Map<String,Object>> mapList;
    private Map<String,Object> map;
    private int[] imgs = {R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};

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

        listView = findViewById(R.id.simpleAdapterListView);

        mapList = new ArrayList<Map<String, Object>>();

        for (int i = 0; i < 10; i++) {
            map = new HashMap<>();
            map.put("img", imgs[i%imgs.length]);
            map.put("title","这是标题"+i+1);
            map.put("content","这是内容"+i+1);
            mapList.add(map);
        }
        SimpleAdapter simpleAdapter = new SimpleAdapter(
        this,
                mapList,
                R.layout.list_item,
                new String[]{"img","title","content"},
                new int[]{R.id.ivImg,R.id.tvTitle,R.id.tvContent}
        );
        listView.setAdapter(simpleAdapter);
    }
}

2.3 BaseAdapter实现

2.3.1数据模型

package com.example.listview.model;

public class Article {
    private Integer id;
    private String title;
    private String intr;

    private Integer imgId;

    public Article(Integer id, String title, String intr, Integer imgId) {
        this.id = id;
        this.title = title;
        this.intr = intr;
        this.imgId = imgId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getintr() {
        return intr;
    }

    public void setintr(String intr) {
        this.intr = intr;
    }

    public Integer getImgId() {
        return imgId;
    }

    public void setImgId(Integer imgId) {
        this.imgId = imgId;
    }
}

2.3.2 BaseAdapterActivity页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.BaseAdapterActivity">
    <ListView
            android:id="@+id/sAdapterListView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
    />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:orientation="horizontal"
             android:padding="4dp"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <ImageView
            android:id="@+id/ivImg"
            android:layout_width="100dp"
            android:layout_height="100dp"
            />
    <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_weight="1"
        >
        <TextView
                android:id="@+id/tvTitle"
                android:layout_width="match_parent"
                android:layout_height="20dp"
                />
        <TextView
                android:id="@+id/tvContent"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                />
    </LinearLayout>
</LinearLayout>

2.3.3 BaseAdapter代码实现

自定义适配器MyAdapter
package com.example.listview.adaptaers;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.listview.R;
import com.example.listview.model.Article;

import java.util.List;

public class MyAdapter extends BaseAdapter {
    private List<Article> articleList;
    private LayoutInflater layoutInflater;
    private Context context;
    public MyAdapter(Context context, List<Article> articleList) {
        this.context = context;
        this.articleList = articleList;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return articleList.size();
    }

    @Override
    public Object getItem(int position) {
        return articleList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return articleList.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.list_item,parent,false);
        }
        ImageView imageView = convertView.findViewById(R.id.ivImg);
        TextView tvTitle = convertView.findViewById(R.id.tvTitle);
        TextView tvContent = convertView.findViewById(R.id.tvContent);
        Article article = articleList.get(position);
        imageView.setImageResource(article.getImgId());
        tvTitle.setText(article.getTitle());
        tvContent.setText(article.getintr());
        return convertView;
    }
}
BaseAdapter实现
package com.example.listview.ui;

import android.os.Bundle;

import android.util.Log;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.listview.R;
import com.example.listview.adaptaers.MyAdapter;
import com.example.listview.model.Article;

import java.util.ArrayList;
import java.util.List;

public class BaseAdapterActivity extends AppCompatActivity {
    private List<Article> articleList;
    private ListView listView;
    private MyAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);
        InitData();
        initView();
    }
    private void initView() {
        listView = findViewById(R.id.sAdapterListView);
        Log.d("TAG",String.valueOf(articleList.size()));
        mAdapter = new MyAdapter(this, articleList);
        listView.setAdapter(mAdapter);
    }
    private void InitData() {
        articleList = new ArrayList<>();
        articleList.add(new Article(1,"可莉","这是内容",R.drawable.a));
        articleList.add(new Article(2,"德莉莎","这是内容",R.drawable.b));
        articleList.add(new Article(3,"应急食品","这是内容",R.drawable.c));
        articleList.add(new Article(4,"派蒙","这是内容",R.drawable.d));
    }
}

2.4 MainActivity实现

2.4.1MainActivity页面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <Button
            android:id="@+id/JumpA"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="ArrayListAdapter"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.023" app:layout_constraintHorizontal_bias="0.0"/>
    <Button
            android:id="@+id/JumpB"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="BaseAdapter"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.163" app:layout_constraintHorizontal_bias="0.0"/>
    <Button
            android:id="@+id/JumpS"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SimpleAdapter"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.093" app:layout_constraintHorizontal_bias="0.0"/>

</androidx.constraintlayout.widget.ConstraintLayout>

2.4.2MainActivity代码实现

package com.example.listview;

import android.content.Intent;
import android.os.Bundle;

import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.example.listview.ui.ArrayListActivity;
import com.example.listview.ui.BaseAdapterActivity;
import com.example.listview.ui.SimpleActivity;

public class MainActivity extends AppCompatActivity {

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

        Button JumpA = findViewById(R.id.JumpA);
        Button JumpS = findViewById(R.id.JumpS);
        Button JumpB = findViewById(R.id.JumpB);

        JumpA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, ArrayListActivity.class);
                startActivity(intent);
            }
        });

        JumpS.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SimpleActivity.class);
                startActivity(intent);
            }
        });

        JumpB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, BaseAdapterActivity.class);
                startActivity(intent);
            }
        });

    }
}

文件结构

下面是一个简单的示例代码,展示如何创建一个自定义适配器(Adapter)来填充ListView的数据: ```java public class MyAdapter extends BaseAdapter { private Context mContext; private List<String> mData; public MyAdapter(Context context, List<String> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { // 如果convertView为空,说明还没有被实例化,需要创建ViewHolder对象,并将其与布局文件进行绑定 convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); viewHolder = new ViewHolder(); viewHolder.textView = convertView.findViewById(R.id.text_view); convertView.setTag(viewHolder); } else { // 如果convertView不为空,则直接从convertView中获取ViewHolder对象 viewHolder = (ViewHolder) convertView.getTag(); } // 设置数据 String item = mData.get(position); viewHolder.textView.setText(item); return convertView; } // ViewHolder类,用于缓存控件实例,避免重复查找 private static class ViewHolder { TextView textView; } } ``` 在上述代码中,首先定义了一个自定义适配器`MyAdapter`,该适配器继承自`BaseAdapter`。在构造方法中传入上下文和数据源,然后实现了必要的方法,包括`getCount()`、`getItem()`、`getItemId()`和`getView()`。 在`getView()`方法中,首先判断convertView是否为null,如果为null则说明需要创建新的布局实例,并将其与ViewHolder对象进行绑定。然后通过ViewHolder对象获取布局中的控件实例,并设置数据。 最后,可以使用`setAdapter()`方法将自定义适配器与ListView进行绑定: ```java ListView listView = findViewById(R.id.list_view); MyAdapter adapter = new MyAdapter(this, dataList); listView.setAdapter(adapter); ``` 其中,`dataList`是一个包含要显示的数据的List集合。通过调用`setAdapter()`方法,将自定义适配器与ListView绑定,即可实现数据填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值