>我正在尝试使用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(( 方法。
在"私有"变量/对象上使用"公共"方法也可能有问题!