如何使用自定义适配器将整数添加到列表视图

Posted

技术标签:

【中文标题】如何使用自定义适配器将整数添加到列表视图【英文标题】:Howto Add Integers to a Listview With Custom Adapter 【发布时间】:2020-02-10 13:43:38 【问题描述】:

我有一个列表视图,其中有两个文本视图,一个编辑文本在同一活动中但不在列表视图中,还有两个按钮,一个用于添加到列表视图,另一个用于从中删除。 如何将整数添加到第一个文本视图,将所有整数的总和添加到第二个文本视图,以及来自自定义适配器。 谢谢。

Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity"
    android:orientation="vertical">
    <EditText
        android:id="@+id/edit_ten"
        android:hint="Score"
        android:layout_
        android:layout_/>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_
        android:layout_>
        <Button
            android:id="@+id/btn_add"
            android:layout_weight="1"
            android:layout_
            android:layout_
            android:text="Add"/>
        <Button
            android:id="@+id/btn_delete"
            android:layout_weight="1"
            android:layout_
            android:layout_
            android:text="Undo"/>

    </LinearLayout>
    <ListView
        android:id="@+id/list_sinhvien"
        android:layout_
        android:layout_>

    </ListView>

</LinearLayout>
item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal">
    <LinearLayout
        android:orientation="vertical"
        android:layout_weight="1"
        android:layout_
        android:layout_>
        <TextView
            android:id="@+id/text_ten"
            android:textSize="20dp"
            android:text="Score"
            android:layout_
            android:layout_/>
        <TextView
            android:id="@+id/text_sdt"
            android:textSize="20dp"
            android:text="Total"
            android:layout_
            android:layout_/>
    </LinearLayout>

</LinearLayout>
MainActivity.java
package com.example.addanddelete;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener 
    ListView listSinhvien;
    EditText editTen;
    Button btnThem , btnSua;
    ArrayList<Sinhvien> arraySinhvien;
    CustomAdapter myadapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        anhxa();
        arraySinhvien = new ArrayList<Sinhvien>();


        myadapter = new CustomAdapter(this , R.layout.item_layout,arraySinhvien);
        listSinhvien.setAdapter(myadapter);
        btnSua.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                final int count = myadapter.getCount();
                myadapter.remove(myadapter.getItem(count -1));
                myadapter.notifyDataSetChanged();

                return;);

    
    private void anhxa()
        listSinhvien = (ListView)findViewById(R.id.list_sinhvien);
        editTen = (EditText)findViewById(R.id.edit_ten);
        btnThem = (Button)findViewById(R.id.btn_add);
        btnSua = (Button)findViewById(R.id.btn_undo);
        btnThem.setOnClickListener(this);
        btnSua.setOnClickListener(this);
    

    @Override
    public void onClick(View view) 
        switch (view.getId())
            case R.id.btn_add:
                Toast.makeText(this, "clicked", Toast.LENGTH_SHORT).show();
                String ten = editTen.getText().toString();
                String sdt = editTen.getText().toString();
                Sinhvien temp = new Sinhvien(R.mipmap.ic_launcher,ten , sdt);
                arraySinhvien.add(temp);
                myadapter.notifyDataSetChanged();
                break;
        

    

CustomAdapter.java
package com.example.addanddelete;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.ArrayList;

public class CustomAdapter extends ArrayAdapter 
    Activity activity;
    int layout;
    ArrayList<Sinhvien> arrSinhVien;

    public CustomAdapter(@NonNull  Activity activity, int layout, @NonNull ArrayList<Sinhvien> arrSinhVien) 
        super(activity, layout, arrSinhVien);
        this.activity = activity;
        this.layout = layout;
        this.arrSinhVien = arrSinhVien;
    

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
        LayoutInflater layoutInflater = activity.getLayoutInflater();
        convertView = layoutInflater.inflate(layout, null);
        TextView ten = (TextView) convertView.findViewById(R.id.text_score);
        TextView sdt = (TextView) convertView.findViewById(R.id.text_total);

        ten.setText(arrSinhVien.get(position).getTenSinhvien());
        sdt.setText(arrSinhVien.get(position).getSdtSinhvien());
        return convertView;
    

Sinhvien.java
package com.example.addanddelete;

public class Sinhvien 

    String tenSinhvien;
    String sdtSinhvien;

    public Sinhvien(String iclauncher,String ten, String sdt) 
    

    public Sinhvien(int iclauncher,String tenSinhvien, String sdtSinhvien) 

        this.tenSinhvien = tenSinhvien;
        this.sdtSinhvien = sdtSinhvien;
    


    public String getTenSinhvien() 
        return tenSinhvien;
    

    public void setTenSinhvien(String tenSinhvien) 
        this.tenSinhvien = tenSinhvien;
    

    public String getSdtSinhvien() 
        return sdtSinhvien;
    

    public void setSdtSinhvien(String sdtSinhvien) 
        this.sdtSinhvien = sdtSinhvien;
    


【问题讨论】:

你有什么代码可以分享吗? 我知道这还不够,但我现在得到的只是这些 【参考方案1】:

您在问题中概述的一般行为/实现有很好的记录。也就是说,我建议考虑使用带有关联自定义项目视图和适配器的RecyclerView,而不是ListView。有一个few reasons why I'd suggest this。

我进行了一些搜索,发现了几个示例,这些示例涵盖了您的实现的总体思路。 This example 很好地说明了如何实现您的目标。本文首先概述了使用RecyclerView 而不是ListViewGridView 的一些原因,然后继续深入介绍如何使用自定义适配器(以及相关项目)实现RecyclerView视图和项目类)。

一目了然,您的实现需要:

一个Activity 包含您的RecyclerView、两个Buttons(用于在RecyclerView 中添加和删除元素)和一个EditText 用于获取用户输入。 自定义项目View 代表您的RecyclerView 列表中的各个项目。这将包含两个TextView 视图(一个用于显示整数,另一个用于显示所有整数的总和)。 一个自定义项模型Class,用于表示上述自定义项View的数据模型。这将保存一个整数值,并且可能包含一些用于显示总和的逻辑。 一个自定义的RecyclerView 适配器(将以上所有内容联系在一起)。这将需要处理将数据集中的数据(根据用户输入增长和缩小)绑定到将出现在RecyclerView 列表中的自定义项的实例的任务。您的添加删除项按钮也可以使用此适配器来修改RecyclerView列表中的元素。

link I provided earlier 中更深入地概述了上述内容。

我真诚地希望对您有所帮助!

【讨论】:

以上是关于如何使用自定义适配器将整数添加到列表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将最新数据附加到android中的自定义基本适配器列表视图?

如何在列表适配器中正确使用 ViewHolder 和自定义视图

使用适用于 Android 应用的自定义适配器将项目动态添加到列表视图

如何使用 glide* 使用数组列表中的自定义适配器将图像设置为列表视图

如何使用来自另一个活动的自定义适配器更新列表视图?

Android - 将搜索栏添加到自定义列表视图和简单适配器