`
923723914
  • 浏览: 637083 次
文章分类
社区版块
存档分类
最新评论

listView中如何加入button或者ImageView

 
阅读更多

第一个问题:

今天做listView困惑了好久,开始一直是不能点击,只能显示,发现:

convertView = LayoutInflater.from(context).inflate(R.layout.setting_net1, null);

原来我setting_net1用了ScrollLayout,肯定是不行的了,所以用LinearLayout。

第二个问题:

ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法

解决办法就是将Button的Focus设置为非默认获取

方法一:将ListView的Item Layout的子控件focusable属性设置为false

方法二:对Item Layout的根控件android:descendantFocusability="blocksDescendant"

方法三:在实现ListView的Adapter的getView方法时,将button.setFocusable(false);

第三个问题:

第三个问题是我认为最麻烦的,这里我一点点的分析。单击item中的选项时候,只有最后一个item响应。如下面所列:

有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。效果如下:

代码为:

public class setNetAdapter extends BaseAdapter {
	private Context context;
	private List<setNet> Messages;	//关联数据
	private boolean btn_Flag = false;
											
	public setNetAdapter(Context context, List<setNet> messages) {
		super();
		this.context = context;
		this.Messages = messages;
	}

	@Override
	public int getCount() {					
		return Messages.size();
	}

	@Override
	public Object getItem(int position) {	
		return Messages.get(position);	
	}

	@Override
	public long getItemId(int position) {	
		return position;
	}

	private ViewHolder holder;
	@Override								
	public View getView(int position, View convertView, ViewGroup parent) {
		holder = null;		
		setNet message = Messages.get(position);
		if (convertView == null) {
			holder =  new ViewHolder();
			convertView = LayoutInflater.from(context).inflate(R.layout.setting_net1, null);
			holder.id = (TextView) convertView.findViewById(R.id.set_net1_id);
			holder.catorgy = (TextView) convertView.findViewById(R.id.set_net1_txt);
			holder.name = (EditText) convertView.findViewById(R.id.set_net1_et1);
			holder.ip = (EditText) convertView.findViewById(R.id.set_net1_et2);
			holder.btn = (ImageView) convertView.findViewById(R.id.set_net1_imgBtn1);		
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder)convertView.getTag();			
		}
		holder.id.setText(message.getId()+"");
		holder.catorgy.setText(message.getCatorgy().toString());
		holder.name.setText(message.getName().toString());
		holder.ip.setText(message.getIp().toString());
		holder.btn.setOnClickListener(new View.OnClickListener() {		
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(btn_Flag == true){				
					holder.name.setEnabled(false);
					holder.ip.setEnabled(false);
					if("".equalsIgnoreCase(holder.name.getText().toString()) ||
							holder.ip.length()<11){
						Toast.makeText(context, "输入有误,请重新输入", Toast.LENGTH_SHORT).show();
					}else{
						holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn2));						
						//数据更新到数据库
						btn_Flag = false;
					}					
				}else{					
					holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn3));
					btn_Flag = true;
				}
			}
		});
		return convertView;
	}
	static class ViewHolder {
		TextView id;
		TextView catorgy;
		EditText name;
		EditText ip;
		ImageView btn;	
	}
}

系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button或ImageView抢夺了listView的焦点,只要布局文件中将Button或ImageView设置为没有焦点就OK了。

问题出来了,为什么每次单击button的时候,只有最后一个item的ImageView去响应这个时间,也只有最后一个Item变化。有点小麻烦,只能仔细分析了。

if (convertView == null) {
	holder =  new ViewHolder();
	convertView = LayoutInflater.from(context).inflate(R.layout.setting_net1, null);
	holder.id = (TextView) convertView.findViewById(R.id.set_net1_id);
	holder.catorgy = (TextView) convertView.findViewById(R.id.set_net1_txt);
	holder.name = (EditText) convertView.findViewById(R.id.set_net1_et1);
	holder.ip = (EditText) convertView.findViewById(R.id.set_net1_et2);
	holder.btn = (ImageView) convertView.findViewById(R.id.set_net1_imgBtn1);		
	convertView.setTag(holder);
}else{
	holder = (ViewHolder)convertView.getTag();			
}


看这里,每次我们的holder都是更新的,完后我们采用了:

holder.btn.setOnClickListener(new View.OnClickListener() {		
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(btn_Flag == true){				
			holder.name.setEnabled(false);
			holder.ip.setEnabled(false);
			if("".equalsIgnoreCase(holder.name.getText().toString()) ||
					holder.ip.length()<11){
				Toast.makeText(context, "输入有误,请重新输入", Toast.LENGTH_SHORT).show();
			}else{
				holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn2));						
				//数据更新到数据库
				btn_Flag = false;
			}					
		}else{					
			holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn3));
			btn_Flag = true;
		}
	}
});

这里可以看出虽然每个ImageView都在监听,也会做出响应,但是holder停留在了最后一个Item对象中,响应的当然只是最后一个Item了。

这里我需要做出修改:public void onClick(View v)这里的View对应ImageView和你单击的还是对应的,需要设置flag。这里我做出的修改:

private List<ViewHolder> holders = new ArrayList<ViewHolder>();
private ViewHolder holder;
@Override								//获取要展示的项目View对象
public View getView(int position, View convertView, ViewGroup parent) {
	holder = null;		
	setNet message = Messages.get(position);
	if (convertView == null) {
		holder =  new ViewHolder();
		convertView = LayoutInflater.from(context).inflate(R.layout.setting_net1, null);
		holder.id = (TextView) convertView.findViewById(R.id.set_net1_id);
		holder.catorgy = (TextView) convertView.findViewById(R.id.set_net1_txt);
		holder.name = (EditText) convertView.findViewById(R.id.set_net1_et1);
		holder.ip = (EditText) convertView.findViewById(R.id.set_net1_et2);
		holder.btn = (ImageView) convertView.findViewById(R.id.set_net1_imgBtn1);		
		holder.btn.setTag(position+"");
		holders.add(holder);
		convertView.setTag(holder);
	}else{
		holder = (ViewHolder)convertView.getTag();			
	}
	holder.id.setText(message.getId()+"");
	holder.catorgy.setText(message.getCatorgy().toString());
	holder.name.setText(message.getName().toString());
	holder.ip.setText(message.getIp().toString());
	holder.btn.setOnClickListener(new View.OnClickListener() {		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Log.i("adapter", v.getTag().toString());
			int index = Integer.parseInt(v.getTag().toString());
			holder = holders.get(index);
			if(btn_Flag == true){				
				holder.name.setEnabled(false);
				holder.ip.setEnabled(false);
				if("".equalsIgnoreCase(holder.name.getText().toString()) ||
						holder.ip.length()<11){
					Toast.makeText(context, "输入有误,请重新输入", Toast.LENGTH_SHORT).show();
				}else{
					holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn2));						
					//数据更新到数据库
					btn_Flag = false;
				}					
			}else{					
				holder.btn.setImageDrawable(context.getResources().getDrawable(R.drawable.btn3));
				btn_Flag = true;
			}
		}
	});
	return convertView;
}

这里使用private List<ViewHolder> holders = new ArrayList<ViewHolder>();这样每次根据public void onClick(View v)中v.getTag来寻找单击的Item,选出对应的holders对应的holder,这里在做出响应即可。

分享到:
评论

相关推荐

    ListView Button ImageView 里应用selector选择器切换图片并保持住

    ListView Button ImageView 里应用selector选择器切换图片并保持住

    ListView控件

    实现 ListView 局部刷新 刷新 public View getView(int position, View convertView, ViewGroup parent) { ViewHold viewHold = null; final int position1 = position; if(null == convertView){ viewHold...

    ListView的View回收引起的checkbox状态改变监听等问题解决方案

    之前讲到了自定义Adapter传递给ListView时,因为ListView的View回收,需要注意当ListView列表项中包含有带有状态...当ListView中有一个或一个一行CheckBox被选中就让ListView上面的Button显示,否则就隐藏。因此,需

    listview每行显示不一样的控件

    listview列表每一行根据需求显示控件!这里边我只定义了三个控件,一个TextView,一个ImageView,一个Button!可以按需求自己定义!也可以是一个布局的!

    Android ListView ImageView实现单选按钮实例

    做Android开发两年的时间,技术稍稍有一些提升,刚好把自己...2 viewHolder.setImageResource(R.id.iv_yuandian1,R.mipmap.ic_button_checked); 3 } else { 4 viewHolder.setImageResource(R.id.iv_yuandian1,R.mipmap.

    findViewById的快捷工具类

    自动转换成子类 textview imageView listView gridView EditText et vq id R id editText1 getView ; 第二次查找id的时候 没有从布局文件中去找 而是保存的变量中获取 vq id R id TextView1 text &quot;second ...

    期末大作业:Android视频播放器

    EditText ImageView ListView等控件 3、对ListView实现自定义布局 4、实现Button点击事件 5、实现页面跳转(不同Activity之间如何跳转),实 现页面之间参数传递,实现参数回传(页面跳转和页面传参3,参数回传4...

    Android ListView详解

    simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有...

    Android UI 问题集注

    问题五、textView中引号的使用问题及button中字体设置问题 问题六、listview中viewflipper的问题 问题七、linear gradient 的问题 问题八、如何去掉activity顶部的gradient? 问题九、如果GridView图片过多,连续几次...

    带登录和滑动界面的日记本

    日记本界面包含TextView、EditText、Button、ViewButton、Fragment、ListView、ViewPager、ImageView

    Android应用开发学习代码集合,基于AndroidStudio

    介绍 学习Android开发的代码,基于AndroidStudio View_Demo是Android基础控件和布局,包括TextView,Edittext,ImageView,Button,RadioButton,Checkbox,ProgressBar和拖动条。 Adapter_Demo 是Adapter相关的代码...

    Android 弹出框风格的dialog登录界面.rar

    从主文件中的一些定义,你可看到此登录框所涉及的一些android内容:  private LinearLayout mLoginLinearLayout; // 登录内容的容器  private LinearLayout mUserIdLinearLayout; // 将下拉弹出窗口在此容器下方...

    全选?反选

    // 用来把一个布局导入到java文件中,起到填充作用 View view = View.inflate(MainActivity.this, R.layout.activity_list, null); ImageView imageView = (ImageView) view.findViewById(R.id.iv); ...

    教你五分钟实现Android超漂亮的刻度轮播控件实例教程

    相信每个Android程序员都知道,我们每天的开发工作当中都在不停地跟View打交道,Android中的任何一个布局、任何一个控件其实都是直接或间接继承自View的,如TextView、Button、ImageView、ListView等。 一些接触...

    编写微信界面(UI界面设计-移动平台开发技术-gddrxy

    2) 按钮类控件 :Button 按钮 ;ImageButton 图片按钮 ;RadioButton与RadioGroup 单选按钮 ;CheckBox 复选按钮 ; 3) 图片控件 :ImageView 负责显示图片 ; 4) 列表控件:ListView 负责显示列表数据; 5) 日期...

    Android UI组件实例集合

    2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。 如: android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingTop="4px" ...

    android的UI设计

    android的UI设计基础教程,内容包括TextView,button,intent,Bundle,AlertDialog,menu,Toast,EditText,ImageButton,ImageView,Gallery,AutoCompleteTextView,ListView,ArrayAdapter,SimpleAdapter等

    开发多媒体播放器

    * 处理文件或者目录的方法 */ private void fileOrDir(String path) { File file = new File(path); if (file.isDirectory()) { getFileDir(file.getPath()); } else { openFile(path); } } /*...

    老罗android视频开发源码和ppt经典

    6.6 EditText中输入特定的字符 6.7 AutoCompleteTextView完成输入 6.8 Button按钮的焦点变化 6.9 Button图文混排的按钮 6.10 RadioButton单选按钮的使用 6.11 ToggleButton按钮的使用 6.12 CheckBox复选框控件使用 ...

    pixate.jar

    ImageView TextView CheckedTextView Button CompoundButton ImageButton ToggleButton RadioButton CheckBox Spinner ListView GridView EditText (support a non-editing mode) ActionBar (not in the View's ...

Global site tag (gtag.js) - Google Analytics