zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android开发 常用的ListView与Adapter

Android开发 常用 listview Adapter
2023-09-14 09:14:00 时间

ListView列表效果如下:

1.适配器MyAdapter类代码:

public abstract class MyAdapter<T> extends BaseAdapter {

    private LayoutInflater inflater;
    private List<T> datas;
    private int resId;

    public MyAdapter(Context context, List<T> datas, int resId) {
        this.inflater = LayoutInflater.from(context);
        this.datas = datas;
        this.resId = resId;
    }

    @Override
    public int getCount() {
        return datas == null ? 0 : datas.size();
    }

    @Override
    public T getItem(int position) {
        return datas == null ? null : datas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = ViewHolder.getViewHolder(inflater, convertView, parent, resId);
        convertView = viewHolder.getConvertView();
        convert(viewHolder, getItem(position), convertView, parent, position);
        return convertView;
    }

    public abstract void convert(ViewHolder holder, T item, View convertView, ViewGroup parent, int position);

    public List<T> getAdapterDatas() {
        return datas;
    }

    public void addDatas(List<T> items) {
        if (datas == null) {
            datas = new ArrayList<>();
        }
        if (items != null) {
            datas.addAll(items);
        }
    }

    public void addDatas(int location, List<T> items) {
        if (datas == null) {
            datas = new ArrayList<>();
        }
        if (items != null) {
            datas.addAll(location, items);
        }
    }

    public void clearDatas() {
        if (datas != null) {
            datas.clear();
        }
    }
}

2.ViewHolder.java,设置文本和图片

public class ViewHolder {

    private final SparseArray<View> views;
    private View convertView;

    private ViewHolder(LayoutInflater inflater, ViewGroup parent, int resId) {
        this.views = new SparseArray<>();
        this.convertView = inflater.inflate(resId, parent, false);
        this.convertView.setTag(this);
    }

    public static ViewHolder getViewHolder(LayoutInflater inflater, View convertView, ViewGroup parent, int resId) {
        if (convertView == null) {
            return new ViewHolder(inflater, parent, resId);
        }
        return (ViewHolder) convertView.getTag();
    }

    @SuppressWarnings("unchecked")
    public <T extends View> T getView(int id) {
        View view = views.get(id);
        if (view == null) {
            view = convertView.findViewById(id);
            views.put(id, view);
        }
        return (T) view;
    }

    public View getConvertView() {
        return convertView;
    }

    public ViewHolder setText(int id, CharSequence text) {
        TextView textView = getView(id);
        textView.setText(text);
        return this;
    }
}

3.使用MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private ListView contentLv;
    private MyAdapter<MyData> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        contentLv = (ListView) findViewById(R.id.lv_content);
        init();
    }

    private void init() {
        List<MyData> datas = getDatas();
        adapter = new MyAdapter<MyData>(MainActivity.this, datas, R.layout.item) {
            @Override
            public void convert(ViewHolder holder, MyData item, View convertView, ViewGroup parent, int position) {
                holder.setText(R.id.tv1, item.getName1());
                holder.setText(R.id.tv2, item.getName2());
            }
        };
        contentLv.setAdapter(adapter);
        contentLv.setOnItemClickListener(itemClickListener);
    }

    private List<MyData> getDatas() {
        List<MyData> datas = new ArrayList<>();
        for (int i = 1; i < 21; i++) {
            MyData data = new MyData("文本:", "文本" + i);
            datas.add(data);
        }
        return datas;
    }

    private AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
            final MyData data = adapter.getItem(position);
            Toast.makeText(MainActivity.this, data.getName2(), Toast.LENGTH_SHORT).show();
        }
    };
}

4.activity_listview.xml

<?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">

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

</LinearLayout>

5.MyData实体类

public class MyData {
    private String name1;
    private String name2;

    public MyData(String name1, String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }

    public String getName1() {
        return name1;
    }

    public void setName1(String name1) {
        this.name1 = name1;
    }

    public String getName2() {
        return name2;
    }

    public void setName2(String name2) {
        this.name2 = name2;
    }
}

6.item的视图

<?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="wrap_content"
    android:orientation="horizontal"
    android:padding="12.0dp">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="5dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3.0"
        android:textSize="16.0sp" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2.0"
        android:gravity="center"
        android:textSize="16.0sp" />

    <ImageView
        android:id="@+id/iv_arrow"
        android:layout_width="15.0dip"
        android:layout_height="15.0dip"
        android:paddingLeft="5.0dp"
        android:src="@drawable/ic_arrow_right" />
</LinearLayout>