ListView 条目中含有checbox,imgbtn,button;如何处理选择时,上下滑动会乱掉
来源:互联网 发布:淘宝账号注销后支付宝 编辑:程序博客网 时间:2024/05/22 03:36
1.先上代码
package com.bjym.myapplication;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.ImageButton;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.HashMap;import static com.bjym.myapplication.R.id.imageButton;public class MainActivity extends Activity { private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); initData();//简单的数据填充 adapter = new MyAdapter(); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.e("ysl","执行了setOnItemClickListener方法:position = "+position+" view = "+view+" parent = "+parent+" id = "+id); Object object = parent.getItemAtPosition(position); //如果数据源是一个对象,可以通过第一个参数拿到 TextView view2 = (TextView) view.findViewById(R.id.tv_name); //可以通过第二个参数拿到item中的textview、button、imageview等等控件 CheckBox box=(CheckBox) view.findViewById(R.id.cb); ImageButton imageButton=(ImageButton) view.findViewById(R.id.imgben);//在集合中改变次位置控件的当前选择状态(如果已经选择了true,就变为不选择false) if (imgbtn.get(position)){ imgbtn.put(position, false); }else { imgbtn.put(position, true); } box.setChecked(!box.isChecked());//CheckBox可以直接获取当前状态,然后设置为新状态。 adapter.notifyDataSetChanged();//把当前屏幕上显示的条目重新加载一遍,getview方法执行了10遍(屏幕上显示了10个条目)。 Toast.makeText(getApplicationContext(), "点击的是item----"+box.getText().toString()+"----"+view2.getText().toString(), Toast.LENGTH_SHORT).show(); } }); } private String[] tvs = new String[100]; private String[] cbs = new String[100]; private String[] btns = new String[100]; private String[] imgbtns = new String[100]; private void initData() { for (int i = 0; i < 100; i++) { tvs[i] = "tvs" + i; cbs[i] = "cbs" + i; btns[i] = "btns" + i; imgbtns[i] = "imgbtns" + i; } } private MyAdapter adapter;//imgbtn使用的集合 HashMap<Integer, Boolean> imgbtn; private class MyAdapter extends BaseAdapter { HashMap<Integer, Boolean> state; public MyAdapter(){ state = new HashMap<Integer, Boolean>();//map中存放的是条目每个位置上选择的状态,默认都是false; imgbtn = new HashMap<Integer, Boolean>(); for (int i = 0; i < imgbtns.length; i++){ imgbtn.put(i, false); } } @Override public int getCount() { return tvs.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { Log.e("ysl","执行了getView方法:position = "+position+" convertView = "+convertView+" parent = "+parent); final ViewHoler vh; if (convertView == null) { vh = new ViewHoler(); convertView = View.inflate(MainActivity.this, R.layout.item_imagebutton, null); vh.tv = (TextView) convertView.findViewById(R.id.tv_name); vh.cb = (CheckBox) convertView.findViewById(R.id.cb); vh.btn = (Button) convertView.findViewById(R.id.btn); vh.imgbtn = (ImageButton) convertView.findViewById(R.id.imgben); convertView.setTag(vh); } else { vh = (ViewHoler) convertView.getTag(); } vh.tv.setText(tvs[position]); vh.cb.setText(cbs[position]); vh.btn.setText(btns[position]);///////////////////////////////////////解决checkbox的选择复用问题//checkbox的集合和其他两个略有不同;state集合只存储了选择的位置,状态为true;//这个集合可以直接获取到都选择了哪些条目;方便获取到最终选择的结果。//因为view的复用;先把监听器设为空,然后设置选择状态,然后再设置监听,去改变集合中各元素的值。 vh.cb.setOnCheckedChangeListener(null); vh.cb.setChecked(state.get(position) == null ? false : true);//集合中有就是true,否则是false; vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { state.put(position, isChecked); } else { state.remove(position); } } }); Log.e("ysl","state = "+state); Log.e("ysl","imgbtn = "+imgbtn); vh.cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "点击的是checkbox"+position, Toast.LENGTH_SHORT).show(); } });///////////////////////////////////////button按钮的事件//直接读取集合,根据布尔值设置显示效果 if (imgbtn.get(position)){ vh.btn.setBackgroundColor(Color.BLUE); }else { vh.btn.setBackgroundColor(Color.WHITE); } vh.btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "点击的是button------------"+vh.tv.getText().toString(), Toast.LENGTH_SHORT).show(); } });///////////////////////////////////////imagebutton的事件//直接读取集合,根据布尔值设置显示效果 if (imgbtn.get(position)){ vh.imgbtn.setBackgroundResource(R.drawable.sina_on); }else { vh.imgbtn.setBackgroundResource(R.drawable.sina_un); } vh.imgbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "点击的是imgbtn"+position, Toast.LENGTH_SHORT).show(); } }); return convertView; } } private class ViewHoler { public ImageButton imgbtn; public Button btn; public CheckBox cb; public TextView tv; }}
2.说明:
选择的状态是用两个集合来存储的,checkbox用的集合只存储选中的,通过监听器来向集合中添加或删除位置信息;
imgbtn和button所使用的集合是全部数据,选中的为true,未选中的为false。通过条目点击事件来设置每个位置上的值是false或true;
在进行adapter.notifyDataSetChanged();时,会根据集合中的不同位置的值来设置显示效果。
两种集合都能实现点击条目不重复选择/乱选的效果。checkbox也可以使用第二中集合的方式,只是如果获取结果的话,第一种比较好(集合中直接就是选中的数据)。
阅读全文
0 0
- ListView 条目中含有checbox,imgbtn,button;如何处理选择时,上下滑动会乱掉
- 如何在含有checkbox的listview条目中获取到选中的条目信息
- 为什么ListView条目中有Button时setOnItemClickListener不生效
- 如何判断listview同一条目被多次点击 listview每个条目中有一个button 点击button可以删除条目中的数据
- ListView中含有Button时setOnclickListener的高效写法
- Android中ListView的条目中有button时,item和button抢焦点问题
- 如何处理List条目中含有EditText,并且EditText中文字或者数字可以修改
- listview中有button,强占条目的点击事件
- 上下滑动的Listview
- ListView上下滑动监听
- ListView上下自动滑动
- Android:处理ListView条目中的Button的点击事件和条目点击事件冲突
- listview条目、button的解决方法
- Android ListView/recyclerView条目中EditText容易失去焦点的问题和取出横向时上下滚动有阴影
- ListView中含有Button时setOnclickListener应写在Adapter的什么地方
- ListView中含有Button时setOnclickListener应写在Adapter的什么地方
- ListView中含有Button时setOnclickListener应写在Adapter的什么地方
- ListView中含有Button时setOnclickListener应写在Adapter的什么地方
- win7系统 深度学习环境 anaconda+tensorflow+jupyter notebook轻松搭建
- 使用react-native启动安卓项目时JS SERVER 未启动报错(Starting JS server...)
- 中科院罗平演讲全文:自动撰写金融文档如何实现,用 AI 解救“金融民工” | CCF-GAIR 2017
- Druid在项目中的应用
- C语言指针专题——如何理解指针
- ListView 条目中含有checbox,imgbtn,button;如何处理选择时,上下滑动会乱掉
- bzoj 1758: [Wc2010]重建计划 长链剖分+线段树
- java中的反射机制
- 这里是android退出时的有用的代码
- [转]Altium Designer 从导入DXF文件,并转换成板框
- 在EC2上创建root用户,并使用root用户登录
- 为Python添加默认模块搜索路径
- 网络流Dinic模板 QQQ
- pycharm快捷键大全