评论列表升级做的处理和问题解决
1、ListView的头部嵌套一个NoscrollListView,数据刷新时发现,NoscrollListView的adapter数据都更新了,但是视图上需要“点击一下”才会更新显示;(不明原因)
第一步,让NoscrollListView获取焦点解决显示问题:更新NoscrollListView的adapter时,NoscrollListView获取焦点 requestFocus(),能实现视图更新,但是NoscrollListView列表样式上的点击事件无效了;
第二步,在NoscrollListView被touch时取消焦点从而恢复列表样式的点击事件:重写NoscrollListView的 onInterceptTouchEvent(),当NoscrollListView请求焦点的同时,设置onInterceptTouchEvent()返回true(即拦截touch事件),给NoscrollListView设置 setOnTouchListener监听,在监听中设置onInterceptTouchEvent()返回false(取消touch事件拦截),并判断NoscrollListView是否 isFocused(),要是有焦点,则 clearFocus()并dispatchTouchEvent,从而在列表样式的按钮被点击时解除NoscrollListView的焦点并让点击事件传达到按钮上。
public class NoScrollListView extends ListView {
public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public NoScrollListView(Context context) {
super(context);
}
public NoScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return isIntercept != -1 ? true : super.onInterceptTouchEvent(ev);
}
private int isIntercept = -1;
public void setIntercept(boolean intercept) {
if (intercept)
isIntercept = 1;
else
isIntercept = -1;
}
}
2、“精彩评论”、“最新评论”的回复刷新方案
第一步,数据前提是只有第一页数据上有“精彩评论”,“最新评论”是分页的,当page大于1时不存在精彩数据;
第二步,不论回复的是精彩还是最新里的评论,按照回复index计算page为1的,更新page=1的数据(精彩、最新都数据更新、视图更新);
第三步,若是回复的是精彩评论,并且目标评论所在最新评论里的pageN>1,那么先更新page=1的数据(精彩、最新都数据更新、视图更新),再更新page=pageN的数据(最新数据更新、视图更新);
第四步,若是回复的是最新评论,并且目标评论所在最新评论里的pageN>1,那么先更新page=pageN的数据(最新数据更新、视图更新),再更新page=1的数据(精彩、最新都数据更新、视图更新)。
3、“回复消息时,监听软键盘隐藏的消息在回复消息完成后调用隐藏软件盘的指令之前执行”
原因在于BaseActivity中有“触碰到非EditText类型的View时,自动隐藏软件盘”的逻辑,当点击发送按钮的时候,软键盘就已经收到“隐藏指令”了。
4、另外,发现基于软键盘显隐做的“输入框”位置调整(setLayoutParamer),评论列表内容越多,视图调整的卡顿越明显,还未找到优化方案