ListView的item中Button的点击以及一些属性的处理
2015-08-06 18:05
513 查看
在ListView的item中包含Button等控件的时候,就会由于焦点的问题导致一些问题。
正常情况下(不添加一些属性的时候),点击每一个item,item是不会获得焦点的,因为在每一个item上设置了button或者ImageButton,CheckBox等控件的时候,此时点击item,获得焦点的是子控件。此时就用到了一个属性android:descendantFocusability。(设置在item的大布局属性中)
下面是官方api的解释。
它的作用就是在定义View和其子控件之间的关系,找到一个指定的View获得焦点。
而且设置的值只能是三个中的其中一个:
beforeDecendants :后代优先获得焦点
afterDescendants:只有当后代不需要焦点的时候才会获得焦点
blocksDescendants:直接可以获得焦点。
此时,只需要设置android:descendantFocusability = “blocksDescendants”;就可以使ListView的item获得焦点了。
我本身的item中只有一个Button,我只需要在button中设置android:focusable = "false";即使不设置上面的属性也成功。
我猜测,因为我只有一个button,当它不要焦点的时候,就只剩下了item了,所以item就会获得焦点。当然,也许有两个button的时候,只设置一个button没有焦点,应该是不行的,应该会另一个button获得焦点。
接下来就是一些属性,当在item的大布局中设置padding的时候,是不生效的,只有在ListView中设置才可以生效。
如果在item的大布局中设置了background,给一张图片的时候,点击item,是没有视觉效果的。
当时如果把这个属性设置在listview中的话,就会有效果。
还有就是设置item之间的分割线,以及分割线的高度。分别是android:divider="";和android:dividerHeight="";这两个属性只有listview中才有的,在item的大布局中设置,是没有这个属性的。
接下来就是item中的button单个事件的处理。
下面贴主要代码:
接下来是adapter的代码:
当想要处理item的点击事件,就实现onItemClickListener接口,并实现当中的onItemClick方法,在里面实现操作即可。
当处理item中的button的时候,就用LayoutInflater.inflate获得布局,然后给定布局id,最后就和其他的activity中的操作一样。
参考博客:
http://blog.csdn.net/qq435757399/article/details/8256453 http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
正常情况下(不添加一些属性的时候),点击每一个item,item是不会获得焦点的,因为在每一个item上设置了button或者ImageButton,CheckBox等控件的时候,此时点击item,获得焦点的是子控件。此时就用到了一个属性android:descendantFocusability。(设置在item的大布局属性中)
下面是官方api的解释。
它的作用就是在定义View和其子控件之间的关系,找到一个指定的View获得焦点。
而且设置的值只能是三个中的其中一个:
beforeDecendants :后代优先获得焦点
afterDescendants:只有当后代不需要焦点的时候才会获得焦点
blocksDescendants:直接可以获得焦点。
此时,只需要设置android:descendantFocusability = “blocksDescendants”;就可以使ListView的item获得焦点了。
我本身的item中只有一个Button,我只需要在button中设置android:focusable = "false";即使不设置上面的属性也成功。
我猜测,因为我只有一个button,当它不要焦点的时候,就只剩下了item了,所以item就会获得焦点。当然,也许有两个button的时候,只设置一个button没有焦点,应该是不行的,应该会另一个button获得焦点。
接下来就是一些属性,当在item的大布局中设置padding的时候,是不生效的,只有在ListView中设置才可以生效。
如果在item的大布局中设置了background,给一张图片的时候,点击item,是没有视觉效果的。
当时如果把这个属性设置在listview中的话,就会有效果。
还有就是设置item之间的分割线,以及分割线的高度。分别是android:divider="";和android:dividerHeight="";这两个属性只有listview中才有的,在item的大布局中设置,是没有这个属性的。
接下来就是item中的button单个事件的处理。
下面贴主要代码:
package com.minstore.market; import java.util.ArrayList; import java.util.List; import com.minstore.market.RefreshableView.PullToRefreshListener; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity implements OnItemClickListener { RefreshableView refreshableView; ListView listView; MyAdapter myAdapter; List<ApkInfoBean> mList = new ArrayList<ApkInfoBean>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); refreshableView = (RefreshableView) findViewById(R.id.refreshable_view); listView = (ListView) findViewById(R.id.list_view); mList = addData(); myAdapter = new MyAdapter(getApplicationContext(), mList); listView.setAdapter(myAdapter); listView.setOnItemClickListener(this); refreshableView.setOnRefreshListener(new PullToRefreshListener() { @Override public void onRefresh() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } refreshableView.finishRefreshing(); } }, 0); } public List<ApkInfoBean> addData() { List<ApkInfoBean> list = new ArrayList<ApkInfoBean>(); for (int i = 0; i < 20; i++) { ApkInfoBean info = new ApkInfoBean(); info.setApk_logo(getResources().getDrawable(R.drawable.test_icon)); info.setApk_name("QQ" + i); info.setApk_size("22" + i + "MB"); info.setApk_update_date("2014/07/" + 17 + i); info.setApk_version("1.2." + 0 + i); list.add(info); } return list; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("Alarm", "什么情况啊?"); Toast.makeText(getApplicationContext(), "zheshi" + position, Toast.LENGTH_SHORT).show(); } }
接下来是adapter的代码:
package com.minstore.market; import java.util.List; import java.util.zip.Inflater; import android.R.integer; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MyAdapter extends BaseAdapter { private Context mContext; private List<ApkInfoBean> mList; public MyAdapter(Context context, List<ApkInfoBean> list) { this.mContext = context; this.mList = list; } @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(int position, View convertView, ViewGroup parent) { ApkInfoBean info = mList.get(position); ViewHolder holder; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item, null); holder = new ViewHolder(); // 每项的视图布局是一样的 holder.logo_iv = (ImageView) convertView.findViewById(R.id.logo_iv); holder.name_tv = (TextView) convertView.findViewById(R.id.name_tv); holder.version_tv = (TextView) convertView .findViewById(R.id.version_tv); holder.size_tv = (TextView) convertView.findViewById(R.id.size_tv); holder.update_date_tv = (TextView) convertView .findViewById(R.id.update_date_tv); holder.install_btn = (Button) convertView .findViewById(R.id.inatall_btn); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 每项的数据是不一样的 holder.logo_iv.setImageDrawable(info.getApk_logo()); holder.name_tv.setText(info.getApk_name()); holder.version_tv.setText(info.getApk_version()); holder.size_tv.setText(info.getApk_size()); holder.update_date_tv.setText(info.getApk_update_date()); holder.install_btn.setOnClickListener(new ListBtnListener(position, mContext)); return convertView; } public class ViewHolder { public ImageView logo_iv; public TextView name_tv; public TextView version_tv; public TextView size_tv; public Button install_btn; public TextView update_date_tv; } public class ListBtnListener implements OnClickListener { int mPosition; Context mContext; public ListBtnListener(int position, Context context) { this.mPosition = position; this.mContext = context; } @Override public void onClick(View v) { Toast.makeText(mContext, "这是第" + mPosition, Toast.LENGTH_SHORT) .show(); } } }
当想要处理item的点击事件,就实现onItemClickListener接口,并实现当中的onItemClick方法,在里面实现操作即可。
当处理item中的button的时候,就用LayoutInflater.inflate获得布局,然后给定布局id,最后就和其他的activity中的操作一样。
参考博客:
http://blog.csdn.net/qq435757399/article/details/8256453 http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
相关文章推荐
- PHP编译过程中常见错误信息的解决方法
- Android使用WindowManager在界面添加一个悬浮框
- Apache的下载安装(主要说的 64位)及问题
- Android基础动画
- Java类型与变量问题
- 网页版的计算器,支持键盘输入,支持删除,按键发亮
- 常见浏览器内核概述
- ERROR 2003 (HY000): Can't connect to MySQL server on '10.16.115.101' (111)
- mysql left right inner join的用法
- js中的字符串
- maven 国内源
- 在web项目中应用shiro
- android 自定义radiobutton的样式 实现自己想要的样子
- java.lang.OutOfMemoryError: GC overhead limit exceeded ECLIPSE解决方法
- jQuery实现hover合成事件的方法
- 怎样在本科阶段发表论文
- 杭电OJ-1062_Text Reverse
- A very hard mathematic problem(二分)
- 心得
- JSOP