【问题标题】:Android ListView does not show list itemsAndroid ListView 不显示列表项
【发布时间】:2017-02-17 08:11:12
【问题描述】:

我想将项目添加到我的列表中,但它只显示第一个:

public class MainActivity extends Activity {

    Server server;
    TextView infoip, msg;
    TextView usersTitle;
    String[] array = {"a"};
    ArrayList<String> lst;
    ArrayAdapter<String> adapter;
    ListView userList;

    @Override
    public void onCreate(Bundle savedInstanceState) {        
        lst = new ArrayList<String>(Arrays.asList(array));
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lst);
        userList = (ListView) findViewById(R.id.userList);
        userList.setAdapter(adapter);

从这个其他类方法中,每次调用它时,我都希望文本低于第一个。该方法当然可以运行,但它不会将文本放在前一个文本的下方。它只显示“a”!有谁知道为什么?

activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {


                        activity.lst.add(message);
                        activity.adapter.notifyDataSetChanged();                           

                    }
                });

我也试过了:

adapter.insert(String, int);

lst.add(int, String);

甚至在 onCreate 方法中添加了这个:

lst.add(1, "2");
adapter.notifyDataSetChanged();

而且还是不加“2”!!

【问题讨论】:

    标签: android list adapter


    【解决方案1】:

    这是您的问题的解决方案。我创建了一个 Activity 类和 Tests java 类。

    public class MainActivity extends Activity {
    String[] array = {"a"};
    public static ArrayList<String> lst;
    ArrayAdapter<String> adapter;
    ListView userList;
    Tests tests = new Tests();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        userList = (ListView) findViewById(R.id.userList);
        lst = new ArrayList<String>(Arrays.asList(array));
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lst);
    
        userList.setAdapter(adapter);
        tests.callThread();
    }
    

    }

    这里是 Tests.java 类 公共类测试 {

    int i = 0;
    String message = "";
    Thread runOnUiThread;
    
    public void callThread()
    
    {
    
    
        new Thread(new Runnable() {
    
            @Override
            public void run() {
                try {
                    while (i < 10) {
                        i = i + 1;
                        message = String.valueOf(i);
                        //Create a server socket object and bind it to a port
                        MainActivity.lst.add(message);
                    }
    
    
                    }catch(Exception e){
                        e.printStackTrace();
                    }
            }
        }).start();
    }
    

    }

    只需在我增加变量 i 的线程内调用您的服务,这样您就可以按正确的顺序填充列表。

    【讨论】:

      【解决方案2】:

      我怀疑 runOnUiThread。您能否提供更多信息,您为什么使用此功能?我也强烈推荐使用RecyclerView

      您也可以参考post 将项目添加到 RecyclerView

      【讨论】:

        【解决方案3】:

        尝试将“lst”和“adapter”都设为静态。

        【讨论】:

          【解决方案4】:

          你能分辨出另一个类是 Activity 还是 Fragment 吗? 在将数据添加到 Arraylist 时,您不需要运行 Thread 即可将新数据插入到 Arraylist

          【讨论】:

          • 这是一个 java 类,我需要线程,因为它是一种服务器连接方法。我只希望连接的用户在列表中。
          • 所以当你调用另一个类时,你必须将引用,即 MainActivity 类的上下文传递给你的调用类。
          • 因为只有您可以调用或使用该 MainActivity 类的成员。因为在 Android 中访问其他类成员与核心 java 编程相比是完全不同的。
          【解决方案5】:

          如果你从另一个类向 Arraylist 添加项目,你必须声明你的 Arraylist 静态。这样它就可以在内存中保存项目。

          将 ArrayList lst 替换为 public static ArrayList

          【讨论】:

          • 使用静态字段是个糟糕的主意。
          猜你喜欢
          • 2016-06-13
          • 2013-01-08
          • 2012-06-24
          • 2017-05-09
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多