在ListView控件的item布局中,怎么只进行item的局部刷新?

时间:2021-07-17 18:05:14
在ListView控件的item布局中,怎么只进行item的局部刷新?

点击预约按钮后,"按钮"按理说会变成已预约的样式,但是上下滑动ListVIew后,又变回了原来的。同时预约名额也不能即时刷新,不知道怎么解决,请各位大神赐教?
贴出部分代码:
ListItemClickHelp.java
package com.xbmu.driver.view;

import android.view.View;

/**
 *  listview点击事件接口
 * Created by Administrator on 2016/2/17 0017.
 */
public interface ListItemClickHelp {
    /**
     * 点击item条目中某个控件回调的方法
     * @param item ListView中item布局的View对象
     * @param parent 父容器对象
     * @param position item在ListView中所处的位置
     * @param which item中要点击的控件的id
     */
    void onClick(View item, View parent, int position, int which);
}


OrderCarListItemClickAdapter.java
package com.xbmu.driver.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

import com.xbmu.driver.R;
import com.xbmu.driver.bean.OrderCarBean.OrderCar;
import com.xbmu.driver.view.ListItemClickHelp;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class OrderCarListItemClickAdapter extends BaseAdapter {
    private Context contxet;
    private ArrayList<OrderCar> mDatas;
    private ListItemClickHelp callback;
    private LayoutInflater mInflater;


    /**
     * @param contxet  上下文
     * @param mDatas   填充的数据
     * @param callback 定义的listview点击事件接口
     */
    public OrderCarListItemClickAdapter(Context contxet, ArrayList<OrderCar> mDatas,
                                        ListItemClickHelp callback) {
        this.contxet = contxet;
        this.mDatas = mDatas;
        this.callback = callback;
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public OrderCar getItem(int position) {
        return mDatas.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, final ViewGroup parent) {
        mInflater = (LayoutInflater) contxet
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.ordercar_pager_item, null);
            holder = new ViewHolder();
            holder.tvDate = (TextView) convertView.findViewById(R.id.item_date);
            holder.time1 = (TextView) convertView.findViewById(R.id.item_time1);
            holder.time2 = (TextView) convertView.findViewById(R.id.item_time2);
            holder.time3 = (TextView) convertView.findViewById(R.id.item_time3);

            holder.num1 = (TextView) convertView.findViewById(R.id.item_num1);
            holder.num2 = (TextView) convertView.findViewById(R.id.item_num2);
            holder.num3 = (TextView) convertView.findViewById(R.id.item_num3);

            holder.btn1 = (Button) convertView.findViewById(R.id.item_btn1);
            holder.btn2 = (Button) convertView.findViewById(R.id.item_btn2);
            holder.btn3 = (Button) convertView.findViewById(R.id.item_btn3);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.tvDate.setText(getItem(position).orderdate);

        String orderTimeStr = getItem(position).schedule.ordertime;
        String[] orderTimeArr = orderTimeStr.split("\\|");
        holder.time1.setText(orderTimeArr[0]);
        holder.time2.setText(orderTimeArr[1]);
        holder.time3.setText(orderTimeArr[2]);

        String ordernumStr = getItem(position).schedule.ordernum;
        holder.num1.setText(ordernumStr);
        holder.num2.setText(ordernumStr);
        holder.num3.setText(ordernumStr);


        //根据可预约数量监听按钮的状态
        if (Integer.parseInt(ordernumStr) > 0) {

            holder.btn1.setBackgroundResource(R.drawable.ordered_shape);
            holder.btn1.setText("约车");
            holder.btn2.setBackgroundResource(R.drawable.ordered_shape);
            holder.btn2.setText("约车");
            holder.btn3.setBackgroundResource(R.drawable.ordered_shape);
            holder.btn3.setText("约车");
        } else {
            holder.btn1.setBackgroundResource(R.drawable.no_order_shape);
            holder.btn1.setText("无车");
            holder.btn2.setBackgroundResource(R.drawable.no_order_shape);
            holder.btn2.setText("无车");
            holder.btn3.setBackgroundResource(R.drawable.no_order_shape);
            holder.btn3.setText("无车");
        }

        final View view = convertView;
        final int p = position;
        //获取按钮的id
        final int one = holder.btn1.getId();
        //设置按钮的点击事件
        holder.btn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //回调接口中listview点击事件
                callback.onClick(view, parent, p, one);

            }
        });

        final int two = holder.btn2.getId();
        holder.btn2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                callback.onClick(view, parent, p, two);
            }
        });

        final int three = holder.btn3.getId();
        holder.btn3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                callback.onClick(view, parent, p, three);

            }
        });

        return convertView;
    }

    public static class ViewHolder {
        private TextView tvDate;
        private TextView time1;
        private TextView time2;
        private TextView time3;
        private TextView num1;
        private TextView num2;
        private TextView num3;
        private Button btn1;
        private Button btn2;
        private Button btn3;
    }
}


MyOrderPager.java
[code=java]package com.xbmu.driver.base;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.xbmu.driver.R;
import com.xbmu.driver.bean.OrderCarRecord;
import com.xbmu.driver.db.MyOrderRecordDB;

import java.util.ArrayList;
import java.util.List;

/**
 * 我的预约
 * Created by Administrator on 2016/2/26 0026.
 */
public class MyOrderPager extends BaseLeftMenuItemPager {
    private ListView listView;
    private List<OrderCarRecord> orderCarRecordList;

    public MyOrderPager(Activity mActivity) {
        super(mActivity);
    }


    @Override
    public View initView() {
        listView = new ListView(mActivity);

        MyOrderAdapter adapter = new MyOrderAdapter(orderCarRecordList);
        listView.setAdapter(adapter);
        return listView;
    }

    @Override
    public void initData() {
        super.initData();
        orderCarRecordList = new ArrayList<>();
        MyOrderRecordDB orderRecordDB = new MyOrderRecordDB(mActivity, "DriverHelper.db", null, 1);
        SQLiteDatabase db = orderRecordDB.getWritableDatabase();
        Cursor cursor = db.query("ordercar", null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                String carnumber = cursor.getString(cursor.getColumnIndex("carnumber"));
                String ordertime = cursor.getString(cursor.getColumnIndex("ordertime"));
                String orderdate = cursor.getString(cursor.getColumnIndex("orderdate"));
                OrderCarRecord orderCarRecord = new OrderCarRecord();
                orderCarRecord.carnumber = carnumber;
                orderCarRecord.ordertime = ordertime;
                orderCarRecord.orderdate = orderdate;
                orderCarRecordList.add(orderCarRecord);
            } while (cursor.moveToNext());
        }
        cursor.close();
    }

    private class MyOrderAdapter extends BaseAdapter {
        @ViewInject(R.id.tv_myorder_carnumber)
        private TextView tvOrderCarNumber;
        @ViewInject(R.id.tv_myorder_time)
        private TextView tvOrderTime;
        @ViewInject(R.id.tv_myorder_type)
        private TextView tvOrderType;
        private List<OrderCarRecord> mDatas;

        public MyOrderAdapter(List<OrderCarRecord> orderCarRecordList) {
            this.mDatas = orderCarRecordList;
        }

        @Override
        public int getCount() {
            return mDatas.size();
        }

        @Override
        public OrderCarRecord getItem(int position) {
            return mDatas.get(position);
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = View.inflate(mActivity, R.layout.myorder_layout_item, null);
            ViewUtils.inject(this, itemView);
            tvOrderCarNumber.setText(getItem(position).carnumber);
            tvOrderTime.setText(getItem(position).orderdate + " " + getItem(position).ordertime);
            return itemView;
        }
    }
}
[/code]

6 个解决方案

#1


这个是因为listView的重用机制导致的,listView会把当前滚动到不可见区域的条目UI重新拿出来给后面加载出来的数据重用展示。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新

你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。

#2


我也同意楼上说的,这个是复用导致的,你可以通过设置标签来解决
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可

#3


adapter中的元数据也需要更新

#4


你对 已约 和 未约 做个状态判断 在getView 对这个状态判断 然后做不同的显示效果 已约后把对应的Item的状态改下 notifyDatasetChanged 下

#5


你应该要记住状态  根据item的状态来决定怎么显示item 下午 抽时间写了一个demo 下载地址 ttps://github.com/zhoulinxue/Listdemo.git   你拿到demo后 只需要把状态 改为 由服务器记录就好了。

#6


https://github.com/zhoulinxue/Listdemo.git

#1


这个是因为listView的重用机制导致的,listView会把当前滚动到不可见区域的条目UI重新拿出来给后面加载出来的数据重用展示。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新

你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。

#2


我也同意楼上说的,这个是复用导致的,你可以通过设置标签来解决
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可

#3


adapter中的元数据也需要更新

#4


你对 已约 和 未约 做个状态判断 在getView 对这个状态判断 然后做不同的显示效果 已约后把对应的Item的状态改下 notifyDatasetChanged 下

#5


你应该要记住状态  根据item的状态来决定怎么显示item 下午 抽时间写了一个demo 下载地址 ttps://github.com/zhoulinxue/Listdemo.git   你拿到demo后 只需要把状态 改为 由服务器记录就好了。

#6


https://github.com/zhoulinxue/Listdemo.git