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;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux中查看java进程的命令_linux查看进程grep

    linux中查看java进程的命令_linux查看进程grep[root@vm-linux-x86~]#ps-ef|grepjavaroot   4834  1 2Jun10pts/6  03:10:50/opt/JDK/jdk1.6.0_21/bin/java-classpath/opt/JReport/Server_B201106081302/derby/lib/*:/opt/JReport/Server_B2

    2022年8月23日
    6
  • rwx权限详解

    rwx权限详解

    2022年6月11日
    37
  • Docker常用命令大全「建议收藏」

    Docker常用命令大全「建议收藏」Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化、容器是完全使用沙箱机制,彼此之间没有任何接口。一个完整的Docker有以下几个部分组成:DockerClient客户端Docker守护进程守护进程Docker镜像镜像Docker容器容器下面是Docker的常用命令:Docker常用命令大全容器生命周期管理命令runstart/stop/restart

    2022年9月18日
    4
  • dijkstra算法求最短路_图论的最短路问题

    dijkstra算法求最短路_图论的最短路问题原题链接战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的

    2022年8月9日
    9
  • vue学习笔记(二)——字符组件传值「建议收藏」

    vue学习笔记(二)——字符组件传值「建议收藏」1、子组件向父组件传值、vue中splice和$emit使用:https://blog.csdn.net/BlackPlus28/article/details/100136811<body> <div id=”app”> <!– v-model 数据双向绑定 –> …

    2022年6月13日
    28
  • 【spring】AOP实践[通俗易懂]

    【spring】AOP实践[通俗易懂]【spring】AOP实践

    2022年4月25日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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