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)
blank

相关推荐

  • STN:空间变换网络(Spatial Transformer Network)「建议收藏」

    STN:空间变换网络(Spatial Transformer Network)「建议收藏」空间变换网络(SpatialTransformerNetwork)空间变换网络(SpatialTransformerNetwork)空间变换器(SpatialTransformers)本文的惨开文献为:《SpatialTransformerNetworks》卷积神经网络定义了一个异常强大的模型类,但在计算和参数有效的方式下仍然受限于对输入数据的空间不…

    2022年10月19日
  • 延时函数如何延时

    延时函数如何延时延时函数如何延时**函数样例编译软件编译后的汇编指令Delay_ms(200);…

  • Python 利用pickle库查看pkl文件实例演示,pkl是什么类型的文件?怎么来打开它?「建议收藏」

    Python 利用pickle库查看pkl文件实例演示,pkl是什么类型的文件?怎么来打开它?「建议收藏」pkl是什么类型的文件?怎么来打开它?pkl格式的文件是python用于保存文件用的。本文的重点是怎么打开这类文件,请看大屏幕!博主之前呢也踩了个小坑呢,就是在打开文件的时候用的是r,r是用来打开文本类型文件的,我要打开的是二进制类型的文件,需要用rb。

  • redis+springboot_全集成厨房

    redis+springboot_全集成厨房一、Redis集成简介Redis是我们Java开发中,使用频次非常高的一个nosql数据库,数据以key-value键值对的形式存储在内存中。redis的常用使用场景,可以做缓存,分布式锁,自增序列等,使用redis的方式和我们使用数据库的方式差不多,首先我们要在自己的本机电脑或者服务器上安装一个redis的服务器,通过我们的java客户端在程序中进行集成,然后通过客户端完成对redis的增删改查操作。redis的Java客户端类型还是很多的,常见的有jedis,redission,lettuce等,

  • 电驴(eMule)下载_电驴链接怎么用

    电驴(eMule)下载_电驴链接怎么用先保证服务器连接。在电骡服务器界面右边的“从URL更新server.met”字样下边的小框里输入“http://upd.emule-security.org/server.met”,然后点击“更新”,下载新的服务器列表即可。Kad连接http://upd.emule-security.org/nodes.dathttp://kademlia.ru/download/nodes.dath…

    2022年10月22日
  • vue中解决跨域问题_js跨域解决方案

    vue中解决跨域问题_js跨域解决方案如果你是一个Web前端工程师,那么跨域这个问题肯定是绕不开的!1.创建vue.config.js设置devServer属性module.exports={devServer:{//webpack-dev-server配置host:’localhost’,port:8080,//配置本项目运行端口proxy:{…

发表回复

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

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