您的位置:首页 > 其它

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

2014-03-09 19:24 597 查看
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";
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return 0;
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}

@Override
public 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++) {// 备注1
if (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() {
@Override
public 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() {
@Override
public 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的数据保存。)

好了。终于是几天的熬夜没有白费啊。虽然过程很坎坷。一个人写东西。没人教。很心酸。碰到问题很棘手。但身为一个要编程的男人。这都不是事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐