Android ListView 获取Item的值和得到每一个Item的view对象以及得到他们所对应的控件值

本文详细介绍如何在Android中使用ListView结合自定义BaseAdapter显示列表数据,并通过具体代码实例展示了如何实现列表项的删除功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:

图1:
在这里插入图片描述

图2:

在这里插入图片描述

具体的 ListView 与 BaseAdapter 之间的配合我就不列举代码了,你们可以自己搭建,也可以直接照抄我之前写的:
Android 中 ListView【列表】 与 三大适配器 全面解析 —— 这篇博客
链接: https://blog.youkuaiyun.com/qq_27494201/article/details/95858786

我直接列举实现这个功能的具体代码了:

实现 BaseAdapter 中的代码

public class MyAdapter extends BaseAdapter {
    private List<CostBean> costBeanList;
    private LayoutInflater inflater;

    //  通过构造方法关联数据源与适配器
    public MyAdapter(Context context, List<CostBean> costBeanList) {
        this.costBeanList = costBeanList;

        //  context:要使用当前的Adapter的界面对象mInflater:布局 装载器对象
        this.inflater = LayoutInflater.from(context);
    }

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

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

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


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        //第一次创建view即可,以免给程序带来太多负担
        if (convertView == null){
            holder = new ViewHolder();
            //            由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
            convertView = inflater.inflate(R.layout.ly_item,null);
            holder.imageView = convertView.findViewById(R.id.img_view);
            holder.title = convertView.findViewById(R.id.tv_name);
            holder.content = convertView.findViewById(R.id.tv_info);
            holder.button = convertView.findViewById(R.id.btn_button);
            //这句话的意思就是,让convertView与holder产生关联,通过set保存在Tag中
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
            //通过getTag,取出上面绑定的holder,以免多次绑定,造成资源浪费
        }

        //设置控件的数据,可以理解为从封装的数据中取出一个一个对应的值
        CostBean costBean = costBeanList.get(position);
        holder.imageView.setImageResource(costBean.getImgId());
        holder.title.setText(costBean.getName());
        holder.content.setText(costBean.getInfo());

		//	利用回调的原理,来对按钮进行监听
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                xmOnItemDeleteListener.onDeleteClick(position);
            }
        });

        return convertView;
    }

	//	定义接口方法
    public interface onItemDeleteListener {
        void onDeleteClick(int i);
    }
    
    //	声明接口
    private onItemDeleteListener xmOnItemDeleteListener;


	//	根据我们在回调里写的是 xmOnItemDeleteListener 调用的onDeleteClick
	//	系统就会执行下面的方法
    public void setXmOnItemDeleteListener(onItemDeleteListener xmOnItemDeleteListener){
        this.xmOnItemDeleteListener = xmOnItemDeleteListener;
    }
    

    class ViewHolder{
        public ImageView imageView;
        public TextView title;
        public TextView content;
        private Button button;
    }

MainActivity.java:

public class MainActivity extends AppCompatActivity  {
    private MyAdapter adapter;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ListView listView = findViewById(R.id.lv_list);
        List<CostBean> costBeanList = new ArrayList<>();	//创建封装好的bean对象

        //	装配数据源
        costBeanList.add(new CostBean(R.drawable.ic_one,"狐狸","聪明的狐狸"));
        costBeanList.add(new CostBean(R.drawable.ic_kenan,"玫瑰","带刺的花儿"));
        costBeanList.add(new CostBean(R.drawable.ic_three,"国王","没有一个臣民"));

        adapter = new MyAdapter(this,costBeanList);

        //  实现回调接口
        adapter.setXmOnItemDeleteListener(new MyAdapter.onItemDeleteListener() {
            @Override
            //  当用户点击了收藏按钮时,系统就会自动调用里面的方法
        public void onDeleteClick(int position) {                       //  position  是Item的位置

                View view = findView(position,listView);        //  根据 position的下标 与 listView找到他的 View
                textView = view.findViewById(R.id.tv_name);
                String str = textView.getText().toString();
                Toast.makeText(MainActivity.this,str + "\n第 "+position+" 项",Toast.LENGTH_LONG).show();
            }

        });

        listView.setAdapter(adapter);

    }

    //  得到每一个不同的Item所对应的 View
    private View findView(int position, ListView listView) {
        int firstListItemPosition = listView.getFirstVisiblePosition();
        int lastListItemPosition = firstListItemPosition
                + listView.getChildCount() - 1;

        if (position < firstListItemPosition || position > lastListItemPosition) {
            return listView.getAdapter().getView(position, null, listView);
        } else {
            final int childIndex = position - firstListItemPosition;
            return listView.getChildAt(childIndex);
        }
    }

}

利用回调的原理,来解决这个问题!
点击运行,即可实现效果

下面我要列举一个我遇到的坑点:

在这里插入图片描述
具体的错误如图:

在这里插入图片描述

最后,我真诚的希望能评论一句嘛,让我知道你来过,我会很开心的

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值