У меня есть несколько виджетов в 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);
}
Я перепутались в конце, но я просто хотел, чтобы сделать массивы окончательным (подумал, что это поможет не использовать Интернет во время каждой прокрутки), поэтому он выглядит настолько тупым :(
Это помогло, спасибо! Но что делать, если у меня есть другой список со строками и изображениями (также разобранный по URL), а иногда, когда я запускаю это действие и прокручиваю его сразу после запуска (не дожидаясь нескольких секунд), он начинает создавать список с начала массивы, начиная с первых невидимых предметов? Например, если у меня есть 4 элемента listView и 3 из них видны на стартовом экране, если я прокручиваю его сразу, то 4-й выглядит как 1-й. Что делать? –
@JustinMcGuire Обычно, что я делаю для любого 'RecyclerView' /' ListVIew', у меня есть 3 обязательных ячейки, которые я использую для разных случаев поверх любых обычных ячеек: 1) 'loading_cell.xml' - показывая некоторое состояние загрузки, пока данные выполняется обновление 2) 'empty_cell.xml' - показать, когда новые данные пустые или пусты, т.е. ничего не показывать 3)' error_cell.xml' - когда новые данные являются ошибкой. Пока вы загружаете данные, покажите (1), когда данные готовы, создайте новый адаптер с новыми данными, а затем установите его как «ListView.setAdapter()». 'Примечание' ** Никогда ** не добавляйте большие удаленные вызовы в' getView() 'или только когда это абсолютно необходимо. –