带有LinkedHashMap的Android ListView - 滚动时的乱码列表

时间:2015-10-03 19:49:32

标签: java android listview linkedhashmap

我很难找到关于将LinkedHashMap与ListView for Android一起使用的大量文档,但我能够通过以下方式正确填充列表。

不幸的是,当我滚动时,列表被加扰,就像我使用常规HashMap时一样。我不确定我做错了什么。

MainActivity.java (只有一部分):

public class MainActivity extends ListActivity {
    private ListView dataList;
    ArrayList<String> listItems=new ArrayList<String>();
    ListViewAdapter adapter;
    private ArrayList<LinkedHashMap<String, String>> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dataList = (ListView)findViewById(android.R.id.list);

        list=new ArrayList<LinkedHashMap<String,String>>();
        adapter=new ListViewAdapter(this, list);
        dataList.setAdapter(adapter);

        addItems();
    }

    public void addItems() {
        LinkedHashMap<String,String> row = new LinkedHashMap<String, String>();
        row.put(KEY_COLUMN, key);
        row.put(FIRST_COLUMN, dateTime);
        row.put(SECOND_COLUMN, data1);
        row.put(THIRD_COLUMN, data2);
        row.put(FOURTH_COLUMN, data3);
        list.add(row);
        adapter.notifyDataSetChanged();
    }
}

ListViewAdapter类

public class ListViewAdapter extends BaseAdapter{
    public ArrayList<LinkedHashMap<String, String>> list;
    Activity activity;
    TextView txtKey;
    TextView txtFirst;
    TextView txtSecond;
    TextView txtThird;
    TextView txtFourth;

    public ListViewAdapter(Activity activity,ArrayList<LinkedHashMap<String, String>> list){
        super();
        this.activity = activity;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        if(convertView == null){
            LayoutInflater inflater = activity.getLayoutInflater();
            convertView = inflater.inflate(R.layout.list_row_columns, null);
            txtKey = (TextView) convertView.findViewById(R.id.row_key);
            txtFirst = (TextView) convertView.findViewById(R.id.date_time);
            txtSecond = (TextView) convertView.findViewById(R.id.data1);
            txtThird = (TextView) convertView.findViewById(R.id.data2);
            txtFourth = (TextView) convertView.findViewById(R.id.data3);
        }

        LinkedHashMap<String, String> map = list.get(position);
        txtKey.setText(map.get(KEY_COLUMN));
        txtFirst.setText(map.get(FIRST_COLUMN));
        txtSecond.setText(map.get(SECOND_COLUMN));
        txtThird.setText(map.get(THIRD_COLUMN));
        txtFourth.setText(map.get(FOURTH_COLUMN));

        return convertView;
    }

}

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用ArrayAdapter而不是滚动自己的BaseAdapter子类。但是,假设你真的想扩展BaseAdapter ...

首先,摆脱类声明中的所有小部件(例如TextView txtKey),将它们移动到getView()内的局部变量。

然后,填充这些局部变量,无论您是否在为新布局充气。

其他改进:

  • 当您拥有LayoutInflater.from()时,请勿使用Activity。在getLayoutInflater()上致电Activity,即可获得了解您的主题和风格的LayoutInflater

  • getItem()中使用list.get(position)代替getView()getView()getItem()保持同步。