这里说明:本人第一次写博客,可能写的不算太好。可是这个相关类型的研究与拓展,是项目中比較难得的。所以开一篇博客来总结和思考。先让我们看看项目需求。

项目需求说明:

1、须要在点击EditText的时候显示Button

2、点击其它条目的EditText的时候,必须在当前条目中显示Button,其它条目中的Button必须隐藏

3、滚动ListView的时候不可以显示错乱信息和错乱显示

4、在滚动的时候。假设条目不显示。那么必须隐藏Button

Content:

注意:布局文件就不须要细致去看了,主要还是依据需求来写相应的代码。完毕功能就好。
/**我们就看这个适配器里面的内容,在listView显示和ListView适配的时候,适配器始终是一个重要的相关内容。我们把适配器提取出来,细致研究究竟是怎么做到适配的。

*/
public class ProductManagerAdapter extends BaseAdapter {
private List<Products> products;//数据源
private Context context;//上下文
private Handler handler;//主线程载体
//private static int temp = -1;//控件静态id来保持单一性
private static ViewHolder tempHolder = null;//控件静态重用对象。用来保持单一性
public ProductManagerAdapter(List<Products> products, Context context,
String type, Handler handler) {//构造方法,传递外界数据以及相应的上下文信息
super();
this.products = products;
this.context = context;
this.handler = handler;
} public void updataAdapter(List<Products> products) {//公开方法,用来动态改变显示条目
if (products != null) {
this.products = products;
notifyDataSetChanged();
}
} @Override
public int getCount() { return products == null ? 0 : products.size();
} @Override
public Object getItem(int position) { return products.get(position);
} @Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Products product = products.get(position);
ViewHolder holder = null; if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.item_products_manager,
null);
holder.price_save = (TextView) convertView
.findViewById(R.id.price_save);
holder.product_chengben = (EditText) convertView
.findViewById(R.id.product_chengben);
holder.product_price = (EditText) convertView
.findViewById(R.id.product_price);
holder.product_chengben.setTag(position); //保存相应的条目位置,防止被重用
holder.product_price.setTag(position); //保存相应的条目位置。防止被重用
**savingPosition**(holder, holder.product_chengben, "chengben", position);//重要方法A~參见后面具体分析
**savingPosition**(holder, holder.product_price, "price", position);
convertView.setTag(holder);
holder.price_save.setVisibility(View.GONE);//条目创建的时候为了摆脱焦点控制机制,所以使用强制性质要求不可以显示button
} else {
holder = (ViewHolder) convertView.getTag();
loseFoucus(holder);//失去焦点
holder.product_price.setTag(position);
holder.product_chengben.setTag(position);
holder.price_save.setVisibility(View.GONE);//滑动过程中,让显示的条目消失
} return convertView;
}
class ViewHolder {
/** 商品价格 */
EditText product_price;
/** 商品成本 */
EditText product_chengben;
/** 保存按钮 */
TextView price_save;
}

在这之前的代码是完整的实现listView显示的控制代码。里面分别的集中几种方法非常重要,必须单独拧出来谈。

下面是重要方法A:savingPosition,下面我们具体分析。

    /** edittext公共操作
* @param position **/
private void savingPosition(ViewHolder holder, final EditText ev,
final String type, int position) { ev.addTextChangedListener(new ThisWatcher(holder) {//为EditText做监听 @Override
public void afterTextChanged(Editable s, ViewHolder holder) {
int p = (Integer) ev.getTag();//获取相应的position
savaData(p, s.toString(), type, holder);//重要方法B~參见后面具体分析
} });
ev.setOnFocusChangeListener(new ForcusChangeDate(holder));//重要监听~參见后面具体分析 }

重要方法B:在保存相应的EditText信息中。使得EditText的内容可以保持在本地缓存中,不被由于页面转换而被消失改变


private void savaData(int p, String s, String tag, ViewHolder holder) {
if (p > products.size()) {//控制焦点
if ("chengben".equals(tag)) {
holder.product_chengben.clearFocus();
} else if ("price".equals(tag)) {
holder.product_price.clearFocus();
} return;
} else {
Products product = products.get(p);
if ("chengben".equals(tag)) {
product.setCostprice(s);
} else if ("price".equals(tag)) {
product.setSaleprice(s);
} products.set(p, product);
} } private abstract class ThisWatcher implements TextWatcher {
ViewHolder holder; public ThisWatcher(ViewHolder holder) {
super();
this.holder = holder;
} @Override
public void afterTextChanged(Editable s) {
afterTextChanged(s, holder);
} @Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) { } @Override
public void onTextChanged(CharSequence s, int start, int before,
int count) { } public abstract void afterTextChanged(Editable s, ViewHolder holder); }

重要监听:这里是最为困难的地方,在写这段代码的时候。遇到非常多困难。正是由于这些困难。我保留了一些遇到的问题代码。来具体解说。

    private class ForcusChangeDate implements OnFocusChangeListener  {

        ViewHolder holder;

        public ForcusChangeDate(ViewHolder holder) {
super();
this.holder = holder;
} /**这里出现了比較多的问题,须要具体的去注意细节控制button的显示*/
@Override
public void onFocusChange(View v, boolean hasFocus) {
/**A:这是正确的方法,将holoder控制成静态方法,然后依据每一个条目的不同来进行*/
if(hasFocus)
{
if(tempHolder == null)
{
//temp = v.getId();
tempHolder = holder;
holder.price_save.setVisibility(View.VISIBLE);
}
else if(tempHolder == holder)
{
holder.price_save.setVisibility(View.VISIBLE); }
else if(tempHolder != holder)
{
tempHolder.price_save.setVisibility(View.GONE);
tempHolder=holder;
holder.price_save.setVisibility(View.VISIBLE);
}
} /**B:这是当中的一种思路。将每一个EditText的ID来控制下来。重用显示,可是由于有两个EditText存在,所以此方法不合适*/ // if (hasFocus) {
// if (temp == -1) {
// holder.price_save.setVisibility(View.VISIBLE);
// if (v.getId() == holder.product_chengben.getId()) {
// temp = holder.product_chengben.getId();
// }else if (v.getId() == holder.product_price.getId()) {
// temp = holder.product_price.getId();
// }
// }else if (temp == holder.product_chengben.getId()|| temp == holder.product_price.getId()) {
// holder.price_save.setVisibility(View.VISIBLE);
// }
//
//
//
// } /**C: 这是刚刚開始的方法,将两种进行推断,可是在实践的过程中发现Android5.0下面的机制可以实现。
Android5.0以上。将focus机制产生了变化。
使得此监听器一直处于运转状态,故一直在true和false中进行无限推断循环
所以不适用
*/ /*if (hasFocus) {
holder.price_save.setVisibility(View.VISIBLE);
} else {
holder.price_save.setVisibility(View.GONE);
}*/ } } /**让EditText失去焦点*/
private void loseFoucus(ViewHolder holder) {
holder.product_chengben.clearFocus();
holder.product_price.clearFocus();
} }

ListView嵌套两个EditText相关显示问题的更多相关文章

  1. ListView嵌套 EditText的光标不显示

    ListView嵌套EditView,有可能会出现了下面现象: 点击EditView,EditView获取焦点后,有可能光标不显示,也有可能光标不闪烁.点击多次后,光标才正常显示. 获取焦点后,edi ...

  2. ScrollView中嵌套两个ListView

    做的项目中要使用两个ListView在同一个页面上下显示,因为数据源不同,不能通过在Adapter中设置标志位去区分显示,最后只能硬着头皮做一个ScrollView嵌套两个ListView,但按正常情 ...

  3. ListView嵌套GridView,显示不全解决办法

    ListView嵌套GridView时,遇到了GridView只显示一行,其余都显示不出来的问题,最终解决办法如下: 需要自定义GridView,重新绘制高度即可: public class MyGr ...

  4. ListView嵌套ListView优化

    在做业务时候,一个ListView显示多种数据类型,我们想到的方法是ListView在嵌套一个ListView,对于子ListView 占父ListView的一行,就攻克了问题,可是这种逻辑是不是有点 ...

  5. Listview嵌套Listview

    今天做项目,打算模仿淘宝的订单管理,需要Listview嵌套Listview,都是两个控件都是沿着一个方向滑动的,嵌套在一起不幸福,以下是解决方案,打个笔记,以后估计还得用: 其中onMeasure函 ...

  6. 浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

    引言 在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求.例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListVie ...

  7. android listView嵌套gridview的使用心得

    在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...

  8. 关于ViewPager被嵌套在ScrollView中不显示的问题

    关于ViewPager被嵌套在ScrollView中不显示的问题 进入全屏 ScrollView 嵌套ViewPager,要不是业务需求这样,估计没人愿意这么干!因为这种方式,会问题多多,简单百度一下 ...

  9. ListView嵌套GridView

    首先,我们通过两个实例来了解下本篇文章所讲的重点,看下图: 微博: 陌陌: 大家应该对这两款软件并不陌生,接下来,我将列举下本文将要实现的几个点: 1.ListView嵌套GridView,互不冲突, ...

随机推荐

  1. DOM的相关概念

    [前面的话]DOM全称是Document Object Model,即文档对象模型.我们常说的html文档其实就是一个DOM树,DOM操作就是在内存中找到DOM树上我们想要的DOM对象,对它的属性进行 ...

  2. selenium webdriver——多表单切换与多窗口切换

    多表单切换 >>在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe 表单内嵌页面上的元素无 ...

  3. HTML5与HTML4的比较

    HHTML5封装一些标签和属性,方便了开发. <form> <p> <label>Username:<input name="search" ...

  4. 【bzoj3771】Triple FFT+容斥原理

    题目描述 樵夫的每一把斧头都有一个价值,不同斧头的价值不同.总损失就是丢掉的斧头价值和. 他想对于每个可能的总损失,计算有几种可能的方案. 注意:如果水神拿走了两把斧头a和b,(a,b)和(b,a)视 ...

  5. 并查集:按秩合并 $n$ 个点所得树高不超过 $\lfloor\log n \rfloor$

    用 $h_n$ 表示按秩合并 $n$ 个点所得树的最大高度. 有 $h_1 = 0, h_2 = 1, h_3 = 1, h_4 = 2, h_5 = 2, \dots$ 有如下地推: \[ h_n ...

  6. 安装淘宝内核LVS

    具体安装方法按照淘宝twiki来:http://kernel.taobao.org/index.php?title=Documents/Kernel_build. 但是有些问题是要注意的: 1. 修改 ...

  7. 【LA5059】Playing With Stones (SG函数)

    题意:有n堆石子,分别有a[i]个.两个游戏者轮流操作,每次可以选一堆,拿走至少一个石子,但不能拿走超过一半的石子. 谁不能拿石子就算输,问先手胜负情况 n<=100,1<=a[i]< ...

  8. 浏览器的 16ms 渲染帧

    标签 归档 关于arttle Land 浏览器的 16ms 渲染帧 DOM JavaScript 异步 性能 重绘 由于现在广泛使用的屏幕都有固定的刷新率(比如最新的一般在 60Hz), 在两次硬件刷 ...

  9. linux 通过MD5监控指定路径文件的变动

    脚本须知: 1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限 2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改, ...

  10. 反射$change属性问题

    写DB框架的时候,使用反射获取属性的时候,多了一个$change属性,当场一脸懵比.   stackoverflow 发现是Android Studio2.0的.Instant Run 的问题.  解 ...