2015-10-03 3 views
0

Мне не удалось найти документацию по использованию LinkedHashMap со списком ListView для Android, но мне удалось получить список, чтобы правильно заполнить приведенным ниже.Android ListView с LinkedHashMap - скремблированный список при прокрутке

К сожалению, при прокрутке список скремблируется так же, как если бы я использовал обычный 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; 
    } 

} 
+0

Что вы подразумеваете под 'списком, скремблировано так же, как если бы я использовал обычный HashMap'? – Rami

+0

Из того, что я понимаю, HashMap (который я первоначально использовал) скремблирует порядок строк при обновлении данных или прокрутке списка, поэтому Link LinkHhashMap был создан для решения этой проблемы (http://www.tutorialspoint.com/ Java/java_linkedhashmap_class.htm). Эта ветка также объясняет разницу: http://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-treemap – Feedslant

ответ

2

Самым простым решением было бы использовать ArrayAdapter вместо прокатки свой собственный BaseAdapter подкласс. Но, если предположить, что вы действительно хотите продлить BaseAdapter ...

Во-первых, избавиться от всех виджетов из объявления класса (например, TextView txtKey), перемещая их локальные переменные внутри getView().

Затем заполните эти локальные переменные независимо от того, раздуваете ли вы новый макет.

Другие улучшения:

  • Никогда не использовать LayoutInflater.from(), когда у вас есть Activity. Позвоните по телефону getLayoutInflater() по номеру Activity, поэтому вы получите LayoutInflater, который знает о ваших темах и стилях.

  • Использование getItem() вместо list.get(position), в getView(), так getView() и getItem() пребывание в синхронизации.

+0

Я смог использовать ваше предложение, чтобы пойти с ArrayAdapter против BaseAdapter, чтобы найти эти источники, которые решили эту проблему. Благодаря! https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView https://github.com/codepath/android-custom-array-adapter-demo – Feedslant