Я пытаюсь обновить listView с помощью функции добавления класса customAdapter. Однако я встречаю странное поведение. Первая попытка добавления элемента работает, но после этого listView не обновляется. Я смотрю на многие форумы (вот как я дошел до сих пор в первую очередь), но здесь я не могу добиться прогресса.notifyDataSetChanged не обновляет listView
Вот код: HomeScreen.java
package com.apress.gerber.mathematicalcalculator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Intent;
public class HomeScreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_home_screen, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onClickLogTable(View view){
Intent logTableLauncherInternt = new Intent(this, LogTable.class);
startActivity(logTableLauncherInternt);
}
}
LogTable.java
package com.apress.gerber.mathematicalcalculator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
public class LogTable extends AppCompatActivity {
public customAdapter c;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log_table);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
public void onClickCalculate(View view){
EditText logBaseValue = (EditText) findViewById(R.id.logBaseValue);
if(logBaseValue.getText().toString().length()<=0) {
Toast.makeText(LogTable.this, "Input Something", Toast.LENGTH_LONG).show();
return;
}
int logBase = Integer.parseInt(logBaseValue.getText().toString());
logBaseValue.setText(String.format("%d",logBase));
if(logBase != logBase)
Toast.makeText(LogTable.this, "Invalid Input", Toast.LENGTH_LONG).show();
String[] numbers = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"};
c = new customAdapter(this, numbers, logBase);
ListAdapter logTableAdapter = c;
ListView logTable = (ListView) findViewById(R.id.logTable);
logTable.setAdapter(logTableAdapter);
logTable.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount>=(totalItemCount-3)){
Integer asd = (int) Math.ceil(Math.random()*100);
Log.d("RedMango", "" + asd);
c.add(Integer.toString(asd));
}
}
});
}
}
customAdapter.java
package com.apress.gerber.mathematicalcalculator;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by as on 10/10/15.
*/
class customAdapter extends ArrayAdapter<String>{
private static List<String> ListValues = new ArrayList<String>();
private static List<String> LogValues = new ArrayList<String>();
private Integer BaseValue;
public customAdapter(Context context, String[] listValues, int baseValue) {
super(context, R.layout.infiniteloglayout, listValues);
for(int i=0; i<listValues.length-1; i++){
ListValues.add(listValues[i]);
LogValues.add(Double.toString(Math.log(Double.parseDouble(listValues[i]))/Math.log(baseValue)));
}
BaseValue = baseValue;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater logInflater = LayoutInflater.from(getContext());
View infiniteloglayout = logInflater.inflate(R.layout.infiniteloglayout, parent, false);
TextView value = (TextView) infiniteloglayout.findViewById(R.id.value);
TextView logValue = (TextView) infiniteloglayout.findViewById(R.id.logValue);
value.setText(ListValues.get(position));
logValue.setText(LogValues.get(position));
return infiniteloglayout;
}
public void add(String value) {
ListValues.add(value);
LogValues.add(Double.toString(Math.log(Double.parseDouble(value))/Math.log(BaseValue)));
Log.d("RedMango", "ListValues " + ListValues.size());
this.notifyDataSetChanged();
}
}
Проблема в том, что после того, как onScrollListner вызывается, первый случайный элемент добавляется в список на экране. Однако после этого на экране нет добавлений. Я попытался выполнить регистрацию данных, и я могу подтвердить, что функции запущены, данные добавляются в список в адаптере, однако данные не обновляются (кроме первой записи). Может ли кто-нибудь указать, где я совершил ошибку. Я также попытался переместить notifyDataSetChanged из класса, но это не изменило поведение.
Примечание: Это мой первый пост в stackoverflow, поэтому, если я допустил какую-либо ошибку (например, нарушение некоторых негласных правил), сообщите мне.
я столкнулся с подобной проблемой в последнее время, и я установил его, окружив 'notifyDataSetChanged()' в «Handler.post (Runnable)». Обработчик отправляет его в очередь сообщений потока пользовательского интерфейса. Вы можете попробовать. – ProtossShuttle