Android-listview item 事件响 改变组件属性值问题(附图说明)
问题:首先我在listView的item上放上了一些组件(例如button),然后我对item上组件进行设置监听事件,事件是在adapter里面设定的。代码如下:
@Override
public View getView(int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
//RecentViewHolder holder;
if(view == null){
holder = new RecentViewHolder();
view = mInflater.inflate(R.layout.item_today_list, null);
//findViewById
holder.mXXxxx = (XXXXX) view.findViewById(R.id.XXXXXX);
....
....
//设置响应(自定义函数)
setItemOnClick(holder);
//标记Tag
view.setTag(holder);
}else{
holder = (RecentViewHolder) view.getTag();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
http://blog.csdn.net/aomandeshangxiao/article/details/7681380
看一下我写的这个博客吧,解决了这个问题。
参考@李鲁 的博文,做了下面的Demo,可以实现点击Button控制TextView的功能,原理就是在每次onClick事件后,执行notifyDataSetChanged(),然后再getView()方法中判断。
public class MainActivity extends ListActivity {
private MyListAdapter mAdapter;
private Context mContext=this;
private List<String> mList;
private List<Integer> mTextViewVisibility;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mList=getData();
mAdapter=new MyListAdapter();
this.setListAdapter(mAdapter);
}
private List<String> getData() {
mTextViewVisibility=new ArrayList<Integer>();
List<String> data=new ArrayList<String>();
for(int i=0; i < 20; i++) {
data.add("cstdr " + i);
mTextViewVisibility.add(1);
}
return data;
}
public final class ViewHolder {
public int id;
public RelativeLayout mRl;
public TextView mTv;
public Button mBtn;
}
public class MyListAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ViewHolder holder;
MyListAdapter() {
inflater=LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null) {
holder=new ViewHolder();
convertView=inflater.inflate(R.layout.activity_main, null);
holder.id=position;
holder.mTv=(TextView)convertView.findViewById(R.id.text);
holder.mBtn=(Button)convertView.findViewById(R.id.btn);
convertView.setTag(holder);
} else {
holder=(ViewHolder)convertView.getTag();
}
holder.mTv.setText(mList.get(position));
if(mTextViewVisibility.get(position) == 1) {
holder.mTv.setVisibility(View.VISIBLE);
} else {
holder.mTv.setVisibility(View.GONE);
}
holder.mBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
changeTextViewVisable(position);
notifyDataSetChanged();
}
});
return convertView;
}
}
public void changeTextViewVisable(int position) {
if(mTextViewVisibility.get(position) == 1) {
mTextViewVisibility.set(position, 0);
} else {
mTextViewVisibility.set(position, 1);
}
}
}
holder的使用是为了减少执行 findViewById()浪费的时间,所以首先需要明确地就是对控件设置或监听需要放在这些之外
if (convertView == null) {
holder = new ViewHolder();
......
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
//以上之外
然后的工作就是对holder中的button调用 setTag(position); 记住位置并设置监听,在监听内获取组件的标签,代码如下
holder.floorBtn.setTag(position);
holder.floorBtn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
......
}
});
这样就应该可以获取正确的position了
由于listView 中item 里面的控件是复用的 所以每次执行到public View getView(int position, View view, ViewGroup parent) {
if(view==null
{
//这样是错误的当view不等于null 就不会从新设置响应,导致了你上面出现的问题
// setItemOnClick(holder);
}
//每次执行到这里都设置下响应
setItemOnClick(holder);
}函数是都要从新给某些元素绑定值