簡體   English   中英

帶有LinkedHashMap的Android ListView-滾動時的加擾列表

[英]Android ListView with LinkedHashMap - scrambled list when scrolling

我很難找到很多有關將LinkedHashMap與Android的ListView一起使用的文檔,但是我能夠使用以下內容正確填充列表。

不幸的是,當我滾動時,列表的混亂程度與使用常規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;
    }

}

最簡單的解決方案是使用ArrayAdapter而不是滾動自己的BaseAdapter子類。 但是,假設您確實要擴展BaseAdapter ...

首先,從類聲明中刪除所有小部件(例如TextView txtKey ),將它們移到getView()內的局部變量中。

然后,填充這些局部變量,而不管是否要填充新的布局。

其他改進:

  • 擁有Activity時,切勿使用LayoutInflater.from() Activity上調用getLayoutInflater() ,這樣您將獲得一個知道主題和樣式的LayoutInflater

  • getView()使用getItem()而不是list.get(position) ,以便getView()getItem()保持同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM