ListView中实现部分刷新的两种方法

ListView中实现部分刷新的两种方法ListView在开发中用到的地方非常多,我们经常是全部刷新来更新数据,如果只需要更新某一条数据,该怎么实现呢?我在项目中使用过以下两种方法:1.通过点击的位置,获取需要刷新那一列对应的控件,然后在控

大家好,又见面了,我是你们的朋友全栈君。

ListView在开发中用到的地方非常多,我们经常是全部刷新来更新数据,如果只需要更新某一条数据,该怎么实现呢?我在项目中使用过以下两种方法:

1.通过点击的位置,获取需要刷新那一列对应的控件,然后在控件上显示新的数据。
2.通过点击的位置,在数据源上移除对应位置的数据,并且重新设置新的数据,然后刷新。

先看一下效果图
刷新前

假如我们点击第二条数据里面的刷新按钮,变成下面的效果

刷新后

下面我们看一下这个简单示例的代码:

public class MainActivity extends Activity {

    private ListView lvMain;
    private TestAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvMain = (ListView) findViewById(R.id.mListView);
        adapter = new TestAdapter(this,getDatas());
        adapter.setListView(lvMain);
        lvMain.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    //数据源
    private List<StudentBean> getDatas(){
        List<StudentBean> studentList = new ArrayList<StudentBean>();
        for(int i = 0;i < 6; i++){
            StudentBean st = new StudentBean();
            st.setName("孙悟空" + i);
            st.setHobby("打妖怪 " + i);
            studentList.add(st);
        }
        return studentList;
    }
}

adapter里面,主要是按钮点击后,两个方法updateItemView(position) & updateItemData(position),一个是更新ItemView,一个是重新设置数据源来实现更新某一条数据。
这里有个地方需要注意下:View view = mListView.getChildAt(pos – mListView.getFirstVisiblePosition());,位置不要计算错。

public class TestAdapter extends BaseAdapter implements View.OnClickListener{

    private Context ctx;
    private List<StudentBean> studentDatas;

    public TestAdapter(Context ctx, List<StudentBean> studentDatas) {
        this.ctx = ctx;
        this.studentDatas = studentDatas;
    }

    @Override
    public int getCount() {
        return studentDatas == null? 0 : studentDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return studentDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if(convertView == null){            
            convertView = LayoutInflater.from(ctx).inflate(R.layout.adapter_main_item, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.tvItemTitle = (TextView) convertView.findViewById(R.id.tvItemTitle);
            viewHolder.tvItemContent = (TextView) convertView.findViewById(R.id.tvItemContent);
            viewHolder.btnItemRefresh = (Button) convertView.findViewById(R.id.btnItemRefresh);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.tvItemTitle.setText(studentDatas.get(position).getName());
        viewHolder.tvItemContent.setText(studentDatas.get(position).getHobby());
        viewHolder.btnItemRefresh.setTag(position);
        viewHolder.btnItemRefresh.setOnClickListener(this);
        return convertView;
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btnItemRefresh:
            int position = (int) v.getTag();
            //更新ItemView
            updateItemView(position);
            //重新设置数据源来实现更新一条数据
// updateItemData(position);
            break;
        }
    }

    private void updateItemView(int pos){
        if(mListView != null){
            View view = mListView.getChildAt(pos - mListView.getFirstVisiblePosition());
            TextView tvItemTitle = (TextView) view.findViewById(R.id.tvItemTitle);
            TextView tvItemContent = (TextView) view.findViewById(R.id.tvItemContent);
            StudentBean stNew = getNewDatas();
            tvItemTitle.setText(stNew.getName());
            tvItemContent.setText(stNew.getHobby());
        }
    }

    private void updateItemData(int pos){
        StudentBean stNew = getNewDatas();
        studentDatas.remove(pos);
        studentDatas.add(pos, stNew);
        notifyDataSetChanged();
    }

    private ListView mListView;
    public void setListView(ListView listView){
        mListView = listView;
    }

    static class ViewHolder{
        TextView tvItemTitle;
        TextView tvItemContent;
        Button btnItemRefresh;
    }

    private StudentBean getNewDatas(){
        StudentBean st = new StudentBean();
        st.setName("二狗子");
        st.setHobby("打土匪");
        return st;
    }
}

StudentBean

public class StudentBean {

    private String name;
    private String hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 测试环境和生产环境数据同步_Django开发测试生产环境

    测试环境和生产环境数据同步_Django开发测试生产环境一、五种环境1、开发环境(DEV):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告。2、测试环境(UAT):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。3、生产环境(PROD):是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这…

  • Python中的numpy库介绍!

    Python中的numpy库介绍!机器学习算法中大部分都是调用Numpy库来完成基础数值计算的。安装方法:pip3installnumpy1.ndarray数组基础python中用列表保存一组值,可将列表当数组使用。另外,python中有array模块,但它不支持多维数组,无论是时列表还是array模块都没有科学运算函数,不适合做矩阵等科学计算。numpy没有使用python本身的数组机制,而是提供了ndarray…

  • 求z=x-y的概率密度_X和Y独立同分布

    求z=x-y的概率密度_X和Y独立同分布Z=X+Y型概率密度的求解@(概率论)Z=g(X,Y)Z=g(X,Y)总结过一次,一般方法是可以由分布函数再求导得到概率密度,计算一定更要小心才能得到正确的解。FZ(z)=P(Z≤z)=P(g(X,Y)≤z)=∫∫g(x,y)≤zf(x,y)dxdyF_Z(z)=P(Z\leqz)=P(g(X,Y)\leqz)\\=\int\int_{g(x,y)\leqz}f(x,y)d

    2022年10月18日
  • nmap命令扫描开放端口

    nmap命令扫描开放端口简单举例下,以下的场景,我使用了nmap命令场景1:使用树莓派但是没有显示器,这时候把树莓派接入局域网,通过使用nmap命令扫描局域网内的所有开放端口,分析扫描信息,从而得出树莓派的局域网ip,这时候就可以通过ip连上树莓派了场景2:nmap常被黑客用于分析服务器哪些端口开放,如果无聊我们也可以看下自己的服务器都开放了哪些端口安装nmap命令Mac上安装nmapbrewinst…

  • python 判断文件是否存在,删除文件

    python 判断文件是否存在,删除文件#判断文件是否存在,path为文件路径importosos.path.exists(path)#删除文件,path为文件路径importosos.remove(path)

  • oracle删除索引语句_oracle索引

    oracle删除索引语句_oracle索引环境Oracle11gsqldropindex索引名;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号