2015-10-11 4 views
1

Я пытаюсь обновить 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, поэтому, если я допустил какую-либо ошибку (например, нарушение некоторых негласных правил), сообщите мне.

+0

я столкнулся с подобной проблемой в последнее время, и я установил его, окружив 'notifyDataSetChanged()' в «Handler.post (Runnable)». Обработчик отправляет его в очередь сообщений потока пользовательского интерфейса. Вы можете попробовать. – ProtossShuttle

ответ

1

Вы указали две разные коллекции одного массива и другого списка и использовали один из них в качестве массива как фактические данные для адаптера, а другой - только в getView для getItem. есть два способа решения этой проблемы:

  1. В вашем методе надстройке на customAdapter. Вместо

    public void add(String value) { 
         ListValues.add(value); 
    

    вы должны использовать

    public void add(String value) { 
          super.add(value); 
    

    удалить ListValues ​​переменную из пользовательского адаптера и GetView использовать

    value.setText(getItem(position)); 
    

    вместо этого. И вы используете for(int i=0; i<listValues.length-1; i++){ вы должны изменить его на for(int i=0; i<listValues.length; i++){

  2. Или вы должны передать данные в ArrayList от деятельности вместо этого. Пример: В адаптере изменения активности на:

    String[] numbers = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"}; 
    ArrayList<String> arrayListValues = new ArrayList<>(Arrays.asList(numbers)); 
    c = new customAdapter(this, arrayListValues, logBase); 
    

    Теперь измените адаптер:

    private static ArrayList<String> ListValues; 
    private static List<String> LogValues = new ArrayList<String>(); 
    private Integer BaseValue; 
    
    public customAdapter(Context context, ArrayList<String> listValues, int baseValue) { 
    super(context, R.layout.infiniteloglayout, listValues); 
    this.ListValues = listValues; 
    for (int i = 0; i < listValues.size(); i++) { 
        LogValues.add(Double.toString(Math.log(Double.parseDouble(listValues[i]))/Math.log(baseValue))); 
    } 
    BaseValue = baseValue; 
    } 
    
+0

Привет, субаш, ваше второе решение сделало трюк. Благодарю. –

Смежные вопросы