自定义适配器通知数据集已更改替换旧数据



>我正在尝试使用customAdapter来填充listView,由于某种原因,当我动态添加新数据时,旧数据被新数据替换,并且添加的新数据完全无序。这是我的自定义适配器:

public class logAdapter extends BaseAdapter {
    private ArrayList<String> kindArray = new ArrayList<String> (), logArray= new ArrayList<String> (), timeArray= new ArrayList<String> ();
    private ArrayList<Integer> viewKind= new ArrayList<Integer> ();
    private LayoutInflater inflater;
    public logAdapter(Context context) {
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        return kindArray.size();
    }
    public void updateData(String kind, String log, String  time, Integer view) {
        this.kindArray.add(kind);
        this.logArray.add(log);
        this.viewKind.add(view);
        this.timeArray.add(time);
        this.notifyDataSetChanged();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View currentView = convertView;
        if (this.viewKind.get(position) == 0)
        {
            if (currentView == null) {
                currentView = inflater.inflate(R.layout.log_list_first, parent, false);
                TextView tView = (TextView)currentView.findViewById(R.id.addr);
                tView.setText(this.logArray.get(position));
                TextView timeView = (TextView)currentView.findViewById(R.id.timeText);
                timeView.setText(this.timeArray.get(position));
            }

        }else if(this.viewKind.get(position) == 1){
            if (currentView == null) {
                currentView = inflater.inflate(R.layout.log_list_middle, parent, false);
                TextView tView = (TextView)currentView.findViewById(R.id.logMessage);
                tView.setText(this.logArray.get(position));
                TextView titleView = (TextView)currentView.findViewById(R.id.kindText);
                titleView.setText(this.kindArray.get(position));
            }
        }else if(this.viewKind.get(position) == 2){
            if (currentView == null) {
                currentView = inflater.inflate(R.layout.log_list, parent, false);
                TextView tView = (TextView)currentView.findViewById(R.id.logMessage);
                tView.setText(this.logArray.get(position));
                TextView titleView = (TextView)currentView.findViewById(R.id.kindText);
                titleView.setText(this.kindArray.get(position));
                TextView timeView = (TextView)currentView.findViewById(R.id.timeText);
                timeView.setText(this.timeArray.get(position));
            }
        }else if (this.viewKind.get(position) == 3)
        {
            if (currentView == null) {
                currentView = inflater.inflate(R.layout.log_list_last, parent, false);
                TextView tView = (TextView)currentView.findViewById(R.id.addr);
                tView.setText(this.logArray.get(position));
                TextView timeView = (TextView)currentView.findViewById(R.id.timeText);
                timeView.setText(this.timeArray.get(position));
            }
        }
        return currentView;
    }
}

我正在添加新数据,如以下代码

public void addLog(String date, String kind, Integer view, String log)
    {
        getActivity().runOnUiThread(new Runnable(){
            public void run() {
                adapter.updateData(kind, log, date, view);
                //simpleList.smoothScrollToPosition(logArray.size());
            }  });
    }

我不明白为什么新数据被无序添加,为什么旧数据在listView中被替换。

感谢您的帮助

迭代

集合(如Java中的列表(不是有保证的顺序,但它通常是默认的OS文件目录整理顺序。您需要将列表作为数组按顺序放置

最初只使用 add(( 方法在创建列表后输入元素

使用 toArray(( 返回类型为 "Object" 的数组

Object arraylist_object = namedarraylist_reference.toArray();
使用 T[

] toArray(T[] a( 将数组从 ArrayList 返回到其"特定对象类型">例如字符串类型

String[] listedStrings = new String[namedarraylist_reference.size()];
namedarraylist_reference.toArray(listedStrings); 

使用 set(int index, E 元素( 替换列表中您想要的元素

namedarraylist_reference.set(3,"WHAT");
// or
namedarraylist_reference.set(7,listedStrings[4]);

之后在 GUI 小部件上调用 repaint(( 方法。

在"私有"变量/对象上使用"公共"方法也可能有问题!

最新更新