zoukankan      html  css  js  c++  java
  • 安卓权威编程指南 挑战练习:实现高效RecyclerView刷新

        Adapter的notifyDataSetChanged方法会通知RecyclerView刷新全部的可见列表项。
        在CriminalIntent应用里,这个方法不够高效,我们知道,返回CrimeListFragment时,最多只有一个Crime
    实例会发生变化。
        只需要刷新列表项中的单个crime项的话,应该使用RecyclerView.Adapter的notifyItemChanged(int)方法。修改代码调用这个方法很简单,但如何定位并刷新具体位置的列表项呢?这是个问题。
    

      

    之前在CriminalIntent应用里面为itemView实现了点击事件。

     1 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
     2 
     3         ......
     4 
     5         public CrimeHolder(View itemView){
     6             super(itemView);
     7             itemView.setOnClickListener(this);
     8             mTitleTextView = (TextView)itemView.findViewById(R.id.list_item_crime_title_text_view);
     9             mDateTextView = (TextView)itemView.findViewById(R.id.list_item_crime_date_text_view);
    10             mSolvedCheckBox = (CheckBox)itemView.findViewById(R.id.list_item_crime_solved_check_box);
    11         }
    12 
    13         @Override
    14         public void onClick(View v){16             Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
    17             startActivity(intent);
    18         }
    19 
    20         ......
    21     }        

    所以现在可以通过点击事件获取到我们点击条目的位置。

    首先添加一个全局变量

    int position;

    然后修改onClick()中的方法

    @Override
            public void onClick(View v){
                position = mCrimeRecyclerView.getChildAdapterPosition(v); //将获取到的位置赋值给之前定义的变量
                Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
                startActivity(intent);
            }

    这里简单说下RecyclerView.getChildAdapterPosition()方法,此方法可以获取ItemView在Adapter中的位置。它接受一个view参数,将onClick()方法中的view参数传入即可。

    最后修改updataUI()方法中的刷新方法

     private void updateUI(){
            //单例模式获取CrimeLab 对象
            CrimeLab crimeLab = CrimeLab.get(getActivity());
            //获取数据
            List<Crime> crimes = crimeLab.getCrimes();
    
            if(mAdapter == null){
                mAdapter = new CrimeAdapter(crimes);
                mCrimeRecyclerView.setAdapter(mAdapter);
            }else{
                mAdapter.notifyItemChanged(position); //这里使用的是notifyItemChanged()方法。 传入的参数为position
            }
        }

    github:https://github.com/FlashFrog/CriminalIntentChallenge.git

  • 相关阅读:
    批量改主机名报错:Address 192.168.43.117 maps to bogon, but this does not map back to the address
    ssh远程登录连接慢的解决方法
    expect脚本远程登录、远程执行命令和脚本传参简单用法
    将集群WEB节点静态数据迁移到共享存储器(LNMP环境)
    LAMP环境搭建之编译安装指南(php-5.3.27.tar.gz)
    手把手教你设置MongoDB密码
    手把手教你在Linux系统下安装MongoDB
    手把手教你在Linux系统下安装MySQL
    在Linux下使用rm -rf /*后会怎样?
    Failed to configure a DataSource 'url' attribute问题解决
  • 原文地址:https://www.cnblogs.com/chase1/p/7168981.html
Copyright © 2011-2022 走看看