Android ListView 获取Item的值和得到每一个Item的view对象以及得到他们所对应的控件值
2023-09-14 09:04:24 时间
效果图:
图1:
图2:
具体的 ListView 与 BaseAdapter 之间的配合我就不列举代码了,你们可以自己搭建,也可以直接照抄我之前写的:
Android 中 ListView【列表】 与 三大适配器 全面解析 —— 这篇博客
链接: https://blog.csdn.net/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);
}
}
}
利用回调的原理,来解决这个问题!
点击运行,即可实现效果
下面我要列举一个我遇到的坑点:
具体的错误如图:
最后,我真诚的希望能评论一句嘛,让我知道你来过,我会很开心的
相关文章
- [Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法
- Android 自定义View 三板斧之二——组合现有控件
- android https安全连接
- android 高斯模糊实现
- Android px、dp、sp之间相互转换
- 腾讯Android七年老开发教你快速突击大厂面试,必知必会的知识点,高薪必备
- Android ViewBinding和DataBinding的几个使用方式 -下
- Android修行手册之Kotlin-【类和对象】、【Get和Set】、【继承】、【接口】【抽象类/嵌套类/内部类】、【数据类】、【泛型】
- Android应用程序窗口(Activity)窗口对象(Window)创建指南
- Android process进程管理
- Android使用KotlinParcelize序列化对象
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
- 在Android中通过Intent使用Bundle传递对象
- android开发launcher
- Android培训班(51)
- android开发中json与java对象相互转换