【学习】ListView子控件的监听及刷新数据不变

来源:互联网 发布:刘美麟因为爱情网络 编辑:程序博客网 时间:2024/06/07 04:50

listview是很有用的一个控件。但我觉得这个真是难。折磨死我了。

废话不谈了。关于listview的基础的知识也不讲了。

listview中添加控件并且对控件进行监听。

开始的时候我直接在设置了adpater后就为listview里面的控件增加监听函数。但是却发现不仅控件的监听器无法促发。就连listview本身也无法触发。看了很多资料。算是见识了。其实就是个焦点的问题。(这个问题以后再讨论。我也没搞透)

上一张图先

在这个item中我放了两个button。要实现对中间文本的加减控制。开始的时候我用的是simpleadapter。发现无论怎么弄都无法完成这个任务。因为根本触发不了button的监听器。后来得大神相助。给力的一段代码。自定义adpter继承baseadapter





package com.example.test;import java.util.HashMap;import java.util.List;import java.util.Map;import android.R.integer;import android.app.AlertDialog;import android.content.Context;import android.content.SharedPreferences;import android.util.Log;import android.util.Printer;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.TextView;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.Toast;public class MySimpleAdapter extends BaseAdapter {private LayoutInflater mInflater;private List<Map<String, Object>> list;private int layoutID;private String flag[];private int ItemIDs[];private Context context;    private String p;    private String mynums[];public MySimpleAdapter(Context context, List<Map<String, Object>> list,int layoutID, String flag[], int ItemIDs[],String mynums[]) {this.mInflater = LayoutInflater.from(context);this.list = list;this.layoutID = layoutID;this.flag = flag;this.ItemIDs = ItemIDs;this.context = context;this.mynums=mynums;this.p="0";}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {if (convertView == null)convertView = mInflater.inflate(layoutID, null);for (int i = 0; i < flag.length; i++) {// 备注1if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {ImageView iv = (ImageView) convertView.findViewById(ItemIDs[i]);iv.setImageResource((Integer) list.get(position).get(flag[i]));} else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);if (tv.getId() == R.id.foodtext) {tv.setText(this.mynums[position]);break;}tv.setText((String) list.get(position).get(flag[i]));} else {// ...备注2}}final TextView tv = (TextView) convertView.findViewById(R.id.foodtext);((Button) convertView.findViewById(R.id.SUB)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String n = (String) tv.getText();int m = Integer.parseInt(n);if (m == 1) {tv.setTextColor(android.graphics.Color.BLACK);m--;tv.setText(m + "");return;}if (m == 0)return;m--;tv.setText(m + "");tv.setTextColor(android.graphics.Color.RED);}});// 为加号的按钮添加监听事件((Button) convertView.findViewById(R.id.ADD)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String n = (String) tv.getText();int m = Integer.parseInt(n);m++;tv.setText(m + "");n = m + "";tv.setTextColor(android.graphics.Color.BLUE);p=n;mynums[position]=p;}});return convertView;}}

而为什么这样做就可以达到对子控件监听的目的呢。

这就要探讨一下listview的显示问题。相信这个问题已经有很多先辈们说过了。我这里说一下就是让自己以后复习起来可以更方便一些。

listview每次显示一个item都会回调

public View getView(final int position, View convertView, ViewGroup parent)
这个函数有三个参数。第一个是这个item在整个列表中的位置。第一个item就是position 0第二个就是position 1.

第二个参数就是一个item的view了。我觉得系统传入这个参数就是为了方便returen回去的。

开始创建item的时候是没有item的。所以没有view。传入的也是一个空值。到了后来传入的是已经存在的view了。这个大家可以百度一下。网上太多了。

而在这个里面。最让我头疼就是中间的文本显示数量的那个。点击add或者sub它发生变化。但是等这个item到了阴影处再回来的时候它又变成0了。

问了很多人。看来很多资料。还是搞不定。可能是基础比较差。但是学习嘛。就是要不停客服苦难。在经历了无数次。un幸运之后。终于是给搞定了。

要想把这个数量对应的保存起来。然后再geiview中去判断。这个文本是不是用来显示数量的。

mynums[position]=p;
这句代码是为了将数量放进数组中存储起来。(开始的时候我的思想也是这样的。但是在初始化数组的时候一直报错。后来就直接当做参数让它传进来。)

if (tv.getId() == R.id.foodtext) {tv.setText(this.mynums[position]);break;}
这个判断就是为了判断这个文本是不是用来显示数量的。如果是就显示刚才数组对应的值。这样就达到了保存数据的作用了。

(这里我只是实现了add的数据保存。)

好了。终于是几天的熬夜没有白费啊。虽然过程很坎坷。一个人写东西。没人教。很心酸。碰到问题很棘手。但身为一个要编程的男人。这都不是事。

0 0
原创粉丝点击