0

У меня есть несколько виджетов в convertView моего списка, и все данные анализируются из json. Сначала я формирую массивы из анализируемых данных, а затем в моем массиве ArrayAdapter я работаю с этими окончательными массивами. Но каждый раз, когда я просматриваю список, приложение переходит к серверу для соответствующей информации (как я вижу в журналах), несмотря на то, что он уже должен храниться в массивах. Возможно, это одна из причин, по которой моя прокрутка listView очень медленная. В чем проблема?android - плавное прокручивание списка с данными из URL

Мой код ArrayAdapter:

public class CustomAdapterSecond extends ArrayAdapter<String> { 

private final Activity context; 
private final String[] sSecondStartTimeArray; 
private final String[] sSecondEndTimeArray; 
private final String[] sSecondTitleArray; 
public CustomAdapterSecond(Activity context, 
        String[] sSecondStartTimeArray, String[] sSecondEndTimeArray, String[] sSecondTitleArray) { 
    super(context, R.layout.relcell2, sSecondStartTimeArray); 
    this.context = context; 
    this.sSecondStartTimeArray = sSecondStartTimeArray; 
    this.sSecondEndTimeArray = sSecondEndTimeArray; 
    this.sSecondTitleArray = sSecondTitleArray; 
} 

static class ViewHolder { 
    public TextView textStartTime; 
    public TextView textEndTime; 
    public TextView textUpper; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    String AllData2 = HTTPRequest.GetData(URL); 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.relcell2main,parent,false); 
     holder = new ViewHolder(); 
     holder.textStartTime = (TextView)convertView.findViewById(R.id.textStartTime); 
     holder.textEndTime = (TextView)convertView.findViewById(R.id.textEndTime); 
     holder.textUpper = (TextView)convertView.findViewById(R.id.textUpper); 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.textStartTime.setText(sSecondStartTimeArray[position]); 
    holder.textEndTime.setText(sSecondEndTimeArray[position]); 
    holder.textUpper.setText(sSecondTitleArray[position]); 

    final int chosen = position; 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int chosenP = chosen; 
      if (chosenP != 0) { 
       Intent intent = new Intent(context, MainThird.class); 
       intent.putExtra("chosenItem", chosenP); 
       context.startActivity(intent);     
      } 
     } 
    }); 
    return convertView; 
} 

И код для моей деятельности, где я формирую массивы:

public class MainSecond extends AppCompatActivity { 

ListView listViewLeft; 
ListView listViewRight; 
int secondChosen=-1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainsecond); 

    secondChosen = getIntent().getExtras().getInt("chosenItem"); 
    final String sStartDate = getIntent().getExtras().getString("startDate"); 
    String sEndDate = getIntent().getExtras().getString("endDate"); 
    final String AllData1 = HTTPRequest.GetData(URL1); 

    TabHost tabs = (TabHost) findViewById(android.R.id.tabhost); 
    tabs.setup(); 
    TabHost.TabSpec spec = tabs.newTabSpec("tag1"); 
    spec.setContent(R.id.tab1); 
    spec.setIndicator("Caption1"); 
    tabs.addTab(spec); 
    spec = tabs.newTabSpec("tag2"); 
    spec.setContent(R.id.tab2); 
    spec.setIndicator("Caption2"); 
    tabs.addTab(spec); 
    tabs.setCurrentTab(0); 

    final String AllData2 = HTTPRequest.GetData(URL); 

    TabHost tabs2 = (TabHost) findViewById(R.id.tabhost2); 
    tabs2.setup(); 
    TabHost.TabSpec spec2 = tabs2.newTabSpec("tag12"); 
    spec2.setContent(R.id.tab12); 
    spec2.setIndicator(sStartDate); 
    tabs2.addTab(spec2); 
    if (!(sStartDate.equals(sEndDate))) { 
     spec2 = tabs2.newTabSpec("tag22"); 
     spec2.setContent(R.id.tab22); 
     spec2.setIndicator(sEndDate); 
     tabs2.addTab(spec2); 
     tabs2.setCurrentTab(0); 
     listViewRight = (ListView)findViewById(R.id.listViewRight); 
    } 

    listViewLeft = (ListView)findViewById(R.id.listViewLeft); 

    //TODO:CreateListView 
    int leng = HTTPRequest.GetLength(AllData2); 
    int lengLeft=0; 
    for (int i=0;i<leng;i++) { 
     if (HTTPRequestSecond.GetSecondStartFecha(AllData2,i).equals(sStartDate)) lengLeft++; 
    } 
    ArrayList<String>sSecondStartTime=new ArrayList<>(); 
    ArrayList<String>sSecondEndTime=new ArrayList<>(); 
    ArrayList<String>sSecondTitle=new ArrayList<>(); 
    for (int j=0;j<lengLeft;j++) { 
     sSecondStartTime.add(j,HTTPRequestSecond.GetSecondStartTime(AllData2,j)); 
     sSecondEndTime.add(j,HTTPRequestSecond.GetSecondEndTime(AllData2, j)); 
     sSecondTitle.add(j,HTTPRequestSecond.GetSecondTitle(AllData2, j)); 
    } 
    String[] sSecondStartTimeArra = new String[sSecondStartTime.size()]; 
    sSecondStartTimeArra = sSecondStartTime.toArray(sSecondStartTimeArra); 
    String[] sSecondEndTimeArra = new String[sSecondEndTime.size()]; 
    sSecondEndTimeArra = sSecondEndTime.toArray(sSecondEndTimeArra); 
    String[] sSecondTitleArra = new String[sSecondTitle.size()]; 
    sSecondTitleArra = sSecondTitle.toArray(sSecondTitleArra); 
    final String[] sSecondStartTimeArray = sSecondStartTimeArra; 
    final String[] sSecondEndTimeArray = sSecondEndTimeArra; 
    final String[] sSecondTitleArray = sSecondTitleArra; 
    CustomAdapterSecond adapter2 = new 
      CustomAdapterSecond(MainSecond.this,sSecondStartTimeArray,sSecondEndTimeArray,sSecondTitleArray); 
    listViewLeft.setAdapter(adapter2); 
} 

Я перепутались в конце, но я просто хотел, чтобы сделать массивы окончательным (подумал, что это поможет не использовать Интернет во время каждой прокрутки), поэтому он выглядит настолько тупым :(

ответ

0

В вашем адаптере getView() первая строка вызывает ag в удаленной службе. Прокомментировать и попробуйте еще раз

public View getView(int position, View convertView, ViewGroup parent) { 
    // String AllData2 = HTTPRequest.GetData(URL); 
... 
+1

Это помогло, спасибо! Но что делать, если у меня есть другой список со строками и изображениями (также разобранный по URL), а иногда, когда я запускаю это действие и прокручиваю его сразу после запуска (не дожидаясь нескольких секунд), он начинает создавать список с начала массивы, начиная с первых невидимых предметов? Например, если у меня есть 4 элемента listView и 3 из них видны на стартовом экране, если я прокручиваю его сразу, то 4-й выглядит как 1-й. Что делать? –

+0

@JustinMcGuire Обычно, что я делаю для любого 'RecyclerView' /' ListVIew', у меня есть 3 обязательных ячейки, которые я использую для разных случаев поверх любых обычных ячеек: 1) 'loading_cell.xml' - показывая некоторое состояние загрузки, пока данные выполняется обновление 2) 'empty_cell.xml' - показать, когда новые данные пустые или пусты, т.е. ничего не показывать 3)' error_cell.xml' - когда новые данные являются ошибкой. Пока вы загружаете данные, покажите (1), когда данные готовы, создайте новый адаптер с новыми данными, а затем установите его как «ListView.setAdapter()». 'Примечание' ** Никогда ** не добавляйте большие удаленные вызовы в' getView() 'или только когда это абсолютно необходимо. –