Android问题11: ListView 单行记录刷新

在网上看了好多文章,写得太专业了,对于我这种散修来说,看完还是茫然。还好看得多了,总也学到点东西,按着自己的理解,尝试了一下,居然也能成功。

记下来,别忘了。

1.  Adapter文件;

在Adapter文件中,可以在getView函数中更新数据,也可以 另造一个public函数来更新数据,意义和getView是相同的;

 /**
     * @param context
     * @param textViewResourceId
     * @param objects
     */
    public List1Adapter(Context context, int textViewResourceId, List<List1Item> objects) {
        super(context, textViewResourceId, objects);

        //把这个ID记录下来;
        m_resID = textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        List1Item _listItem = (List1Item) getItem(position); // 获取当前项的data实例

        View _view1;
        //这一步的处理比较重要
        //如果不使用convertView,而使用LayoutInflater.fromg来获取View,在外部更新数据时,就不能调用getView来;
        //以前没学好,一直没理解这个Adapter的工作方式,学着别人的方法更新,调用getView总是失败;
        if (convertView != null) {
            //如果参数中的VIEw有效,就使用这个;
            _view1 = convertView;
        } else {
            //查找构造函数提供的ID代表的VIEW;
            _view1 = LayoutInflater.from(getContext()).inflate(m_resID, null); //实
        }

        showData(_view1, _listItem);
        return _view1;

    }

    /**
     * view表示listView的行对应的View; , listItem表示用于更新数据的数据源;
     */
    public void showData(View _view, List1Item _listItem) {

        TextView _onlineState;
        
        //更新VIEW显示的数据;
        ((TextView) _view.findViewById(R.id.list01_lab1)).setText(_listItem.getDeviceName());
        ((TextView) _view.findViewById(R.id.list01_comp)).setText(_listItem.getCompanyName());
        _onlineState = ((TextView) _view.findViewById(R.id.list01_online));

        ((TextView) _view.findViewById(R.id.list01_temper1)).setText("当前 " + xiaoid.util.NumericHelper.stringOf(_listItem.currentTemper, "0.0") + "℃");
        ((TextView) _view.findViewById(R.id.list01_temper2)).setText("目标 " + xiaoid.util.NumericHelper.stringOf(_listItem.targetTemper, "0.0") + "℃");

        _onlineState.setText(_listItem.getStateStr());


    }

2. 根据需求更新数据

1) 根据用户点击的记录行来更新数据;

m_list1 = findViewById(R.id.act1_list1);
m_list1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //参数中的position即为记录行索引;
       
    }
});

2) 根据通讯数据更新对应的记录行;

上述两种方法,都有一个共同的position(即listView的行索引);

/**
 * @param _item   数据源,记录行对应的数据;
 * @param _index, 记录行索引;
 */    
private void showDeviceRealtimeInfo(List1Item _item, int _index) {

    //m_list1Adp 是自定义的Adapter对象;
    if (m_list1Adp == null) {
        return;
    }

    //获取listView当前显示的范围;判断index是否在当前显示范围内;
    int _inx1 = m_list1.getFirstVisiblePosition();
    int _inx2 = m_list1.getLastVisiblePosition();
    View _view;

    //判断要更新的行索引是否在inx1,inx2之间(当前可视屏幕范围,不在范围内的,listView滑动到该行时会更新)
    if (_index >= _inx1 && _index <= _inx2) {
        //获取该行对应的View(这个索引值是当前显示范围内的索引-真神奇);
        _view = m_list1.getChildAt(_index - _inx1);
        //通过Adapter的getView刷新该行的数据;
        //m_list1Adp.getView(_index, _view, m_list1);
        //调用自定义的接口刷新数据(同getView一样的效果);
        m_list1Adp.showData(_view, _item);

    } 


}

按着自己的理解去写了一次,成功之后,突然发现,别人写的也能看懂了……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值