×

技术坑

Android RecyclerView使用notifyItemRangeInserted的如何防止跳动

mtsym mtsym 发表于2019-05-04 浏览11638 评论0

Android在处理RecyclerView时候,如果使用notifyItemRangeInserted插入数据后可能界面发生跳动,解决这个问题只需要两步

  1. 把焦点优先获取权交给RecyclerView,并请求焦点,这样容器先hold住了焦点,便不会乱飞了
  2. 数据更新完成后,进行焦点恢复,将焦点优先权交给子元素,然后指定特定的view请求焦点

这个方案能解决大部分焦点乱跳问题,包括快速滚动的

代码大致如下


public void holdFocus(<!--autointro-->

技术坑

zblog远程发布文章API改进实现兼容wordpress xmlrpc

mtsym mtsym 发表于2019-05-04 浏览7720 评论0

最近有个zblog自动发布文章需求,大致看了一下,发现并没有wordpress方便,特别是我还有对接python的要求,大概有几种办法

1. 直接读取/zb_users/c_option.php,暴力写入数据
2. 直接开发一个插件使用zblog内部代码接口
3. 使用zblog本身的xmlrpc

第一种方案为了安全还得自己写鉴权,第二种方案通用性强但是需要对zblog比较了解,第三种方案最方便了,python可以直接使用xmlrpc库对接,由于我已经有wordpress自动发布的python脚本,我想复用这个,因此对zblog的xmlrpc进行改造。

兼容wordpress xmlrpc

找到zb_system/xml-rpc/index.php文件,先在入口判断出增加’mt.supportedMethods’支持,再增加’wp.newPost’支持

case 'mt.supportedMethods':
     $strXML = '<methodResponse><params><param><value><array><data>$%#1#%$</data></array></value></param></params></methodResponse>';
     $strAll = '<value><string>wp.newPost</string></value>';

     echo str_replace("$%#1#%$", $strAll, $strXML);
     break;

case 'wp.newPost':
     $username = (string)$xml->params->param[1]->value->string;
     $password = (string)$xml->params->param[2]->value->string;
     xmlrpc_Verify($username, $password);
     if ($zbp->CheckRights('ArticlePst')) {
         xmlrpc_newPost_as_wp($xml->params->param[3]->value->struct->asXML());
     } else {
         xmlrpc_ShowError(6, __FILE__, __LINE__);
    }
    break;

转化wordpress xmlrpc支持函数如下

```
function xmlrpc_newPost_as_wp($xmlstring)
{
global $zbp;

$xml = simplexml_load_string($xmlstring);

if ($xml) {
    $post = array();
    foreach ($xml->children() as $x) {
        $a = (string)$x->name;
        if ($a == 'terms_names') {
            $struct = $x->value->struct;
            foreach ($struct->children() as $y) {
                $a = (string)$y->name;
                $b = $y->value->children()->asXML();
                $b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>', '<value>', '</value>', PHP_EOL), array(''), $b);
                $post[$a] = $b;
            }
        } else {
            $b = $x->value->children();
            $b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>'), array(''), $b);
            $post[$a] = $b;
        }
    }

    $_POST['ID'] = 0;

    $_POST['Title'] = $post['post_title'];

    if (strcmp('publish', $post['post_status']) != 0) {
        $_POST['Status'] = 0;
    } else {
        $_POST['Status'] = 1;
    }

    if (isset($post['mt_basename'])) {
        $_POST['Alias'] = $post['mt_basename'];
    }
    if (isset($post['dateCreated'])) {
        date_default_timezone_set('GMT');
        $_POST['PostTime'] = strtotime($post['dateCreated']);
        date_default_timezone_set($zbp->option['ZC_TIME_ZONE_NAME']);
        $_POST['PostTime'] = date('c', $_POST['PostTime']);
    }
    if (isset($post['wp_author_id'])) {
        $_POST['AuthorID'] = $post['wp_author_id'];
    } else {
        $_POST['AuthorID'] = $zbp->user->ID;
    }
    if (isset($post['post_tag'])) {
        $_POST['Tag'] = $post['post_tag'];
    }
    if (isset($post['category'])) {
        $post['category'] = str_replace('<value>', '', $post['category']);
        $catename = trim(GetValueInArray(explode('</value>', $post['category']), 0));
        $_POST['CateID'] = $zbp->GetCategoryByName($catename)->ID;
    }
    if (isset($post['mt_excerpt'])) {
        $_POST['Intro'] = $post['mt_excerpt'];
    }
    if (isset($post['mt_text_more']) || isset($post['post_content'])) {
        if (isset($post['mt_text_more'])) {
            if ($post['mt_text_more'] != '') {
                $_POST['Content'] = $post['post_content'] . '

技术坑

windows下部分python使用pip无法安装部分库问题

mtsym mtsym 发表于2019-04-26 浏览3931 评论0

有时候在windows上使用pip安装一些python库会报一些奇怪的错误,比如在安装scrapy的时候,这种情况可以先看报错信息,确定是安装哪个依赖库出现问题,然后去下面的地址

https://www.lfd.uci.edu/~gohlke/pythonlibs/

找到对应的whl文件,确认好是32位还是64位及python版本,下载下来使用下面命令安装上,然后再安装之前的库


pip install xxxx.whl
```<!--autointro-->

技术坑

Android下ObjectBox使用ObjectBrowser报错duplicate class问题

mtsym mtsym 发表于2019-04-26 浏览6714 评论0

Android的orm开源库也挺多的,但是个人项目使用的时候总有一些不满意的地方,稳定的库太复杂了,为了一丁点存储功能引入一个大的库显然不合适,小巧的要么bug多又不太稳定要么使用起来麻烦,在一些项目里面使用了一段时间ObjectBox之后,我把它引入到了一些新的项目,前阵子我想通过objectbrowser查看数据的时候,发现无法编译通过, gradle配置如下


ext.objectboxVersion = '2.3.4'
dependencies {
    implemen<!--autointro-->

技术坑

Android ConstraintLayout出现遮盖问题

mtsym mtsym 发表于2019-04-18 浏览10984 评论0

ConstraintLayoutl出来已经好几年了,很好用的一个布局控件,最大的优势就是能降低布局复杂度,减少布局嵌套层次,老的项目一些复杂的布局使用它进行重写之后会发现性能有大幅的提升,而且基本上能代替LinearLayout/RelativeLayout/FrameLayout这几种布局,有一种一统江湖的趋势。 ConstraintLayout一路上坑也很多,使用的时候各种莫名其妙的问题都有,比如在代替RelativeLayout的时候,嵌套的布局可能出现遮挡遮盖问题,乍一看自己写的约束没

技术坑

如何将本地jar包上传到私有maven库

mtsym mtsym 发表于2019-03-13 浏览6102 评论0

一些项目的库只放在内网,有时候需要远程开发非常不方便,这时候就可以把相应的库传到自己私有的maven库里面,之后在项目配置文件里面加上自己的仓库就行了。

本地缓存的jar包上传有好几种方式

1. 通过Nexus后台的upload功能上传,这个需要填写一堆信息,效率相当低下。
2. 通过maven的发布功能
3. 通过curl

maven上传,自己填充信息

mvn deploy:deploy-file -Dmaven.test.skip=true <!--autointro-->

技术坑

使用Scrapy时json.dumps报错Object of type 'item' is not JSON serializable

mtsym mtsym 发表于2019-03-01 浏览5477 评论0

给养的爬虫扩展了点功能,在分析数据导出结果的时候,使用json.dumps导出一个dict对象,结果报错
Object of type 'item' is not JSON serializable这个dict对象很简单,里面有三个dict,每个dict里面有一个list,每个list里面是一个Scrapy.Item,奇怪的是其他item都没有报错,这个类型的item我检查了所有数据,确定是没有问题