java - notifyDataSetChanged 不更新 listView

标签 java android android-listview notifydatasetchanged

我正在尝试使用 customAdapter 类添加函数更新 listView。但是我遇到了奇怪的行为。第一次尝试添加元素时有效,但之后,listView 不会更新。我查看了很多论坛(这就是我一开始的方式),但这是我无法再取得进展的地方。

代码如下: 主屏幕.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);
    }
}

日志表.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));
                }
            }
        });

    }

}

自定义适配器.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 上的第一篇文章,所以如果我犯了任何错误(比如违反了一些潜规则),请告诉我。

最佳答案

您已经声明了两个不同的集合,一个是数组,另一个是列表,并使用了其中一个,即数组作为适配器的实际数据,另一个仅在 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. 或者您应该改为从 Activity 中将数据作为数组列表传递。例子: 在您的 Activity 中将适配器更改为:

    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;
    }
    

关于java - notifyDataSetChanged 不更新 listView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061012/

相关文章:

java - apache mina sshd core 版本 1.3.0 版本的客户端是否有 gss/kerberos auth 支持

c# - MonoDroid SurfaceView

android - Travis 构建 - 无法从 key 环文件中检索 key ,因为它不存在

android - MonthDisplayHelper.NumberOfDaysInMonth 在 MonoDroid 中返回不正确的值

android - 空指针异常 - 显示用户在服务器的 ListView 中下的订单

android - 如何向 SwipeRefreshLayout 内的 listView 添加标题?

android - Android 4.4 中的快速滚动问题

java - 方法,较小值

java - NoClassDefFound错误: org/hamcrest/Matchers using PowerMock-OSGi

java - java中字符的范围