Android-listview item 事件响 改变组件属性值问题(附图说明)

发布于 2017-01-19 02:45:20 字数 805 浏览 1133 评论 4

问题:首先我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瑾兮 2017-08-07 22:55:43

http://blog.csdn.net/aomandeshangxiao/article/details/7681380
看一下我写的这个博客吧,解决了这个问题。

偏爱自由 2017-07-09 15:56:22

参考@李鲁 的博文,做了下面的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);
}
}

}

清晨说ぺ晚安 2017-04-17 07:31:55

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了

虐人心 2017-01-28 09:22:58

由于listView 中item 里面的控件是复用的 所以每次执行到public View getView(int position, View view, ViewGroup parent) {

if(view==null
{
//这样是错误的当view不等于null 就不会从新设置响应,导致了你上面出现的问题
// setItemOnClick(holder);
}

//每次执行到这里都设置下响应
setItemOnClick(holder);

}函数是都要从新给某些元素绑定值

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文