【问题标题】:updating adapter in ListView android在 ListView android 中更新适配器
【发布时间】:2016-11-07 19:22:10
【问题描述】:

尝试在 Android 中更新我的 listView 时,我的适配器出现问题。我在堆栈上遇到了类似的问题,但仍然没有弄清楚。

我正在开发一种 Bucket List 应用程序,并且我开始了一项新活动,以便将愿望添加到愿望列表中。它只是一个用于学习目的的原型,我尝试在没有异步解决方案的情况下制作它,只需使用适配器.add(“用户插入的愿望”),但应用程序只会崩溃,或者甚至无法启动。我提到我已经检查了发送消息的活动的功能(我只是简单地显示了它,正如您在 onActivityResult 上看到的那样)。下面提供的示例代码也有效,因为我已经注释了问题代码,但没有向 listView 添加任何内容。

那么为什么我认为它不起作用(如果我使用注释代码):如果我将适配器声明在 onCreate 中,则它在 onActivityResult 中不可见 而且我无法使用 add 方法以及适配器,如果我在外部声明我的适配器,它只会崩溃/不启动应用程序。

package com.example.packagename.reforgedbucketlist;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import static com.example.beatriceghetel.reforgedbucketlist.R.styleable.View;

public class MainActivity extends AppCompatActivity {
    public String logMsg = "State";

    String[] wishesArray = {"Preset wish: use this app!","Preset wish: enjoy this app!","Preset wish: rate this app!","Preset wish: recommend this app!"};

    /*ArrayAdapter adapter = new ArrayAdapter<String>(this,
            R.layout.activity_listview, wishesArray);
    ListView listView = (ListView) findViewById(R.id.wishes_list);*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayAdapter adapter = new ArrayAdapter<String>(this,
                R.layout.activity_listview, wishesArray);
        ListView listView = (ListView) findViewById(R.id.wishes_list);
        listView.setAdapter(adapter);
        Log.d(logMsg, "The onCreate() event");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_items, menu);

        MenuItem item1 = (MenuItem) findViewById(R.id.about_id);
        MenuItem item2 = (MenuItem) findViewById(R.id.settings_id);
        MenuItem item3 = (MenuItem) findViewById(R.id.add_wish_id);



        return super.onCreateOptionsMenu(menu);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(logMsg, "The onStart() event");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(logMsg, "The onResume() event");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(logMsg, "The onPause() event");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(logMsg, "The onStop() event");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(logMsg, "The onDestroy() event");
    }

    public void onAddWishClick(MenuItem item) {
        Intent getNewWishIntent = new Intent(this, AddWishActivity.class);
        final int result = 1;
        getNewWishIntent.putExtra("CallingActivity", "Wish");
        startActivityForResult(getNewWishIntent, result);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        TextView userWishView = (TextView) findViewById(R.id.message_sent_back);
        String wishSentBack = data.getStringExtra("UserWish");
        userWishView.append(" " + wishSentBack);

        //adapter.add(wishSentBack);
        //adapter.notifyDataSetChanged();

    }
}

【问题讨论】:

    标签: android listview android-adapter


    【解决方案1】:

    问题是你使用的是一个固定大小的数组。

    尝试将声明更改为:

    public class MainActivity extends AppCompatActivity {
        public String logMsg = "State";
       List<String> list = new ArrayList<>();
    
        String[] wishesArray = {"Preset wish: use this app!","Preset wish: enjoy this app!","Preset wish: rate this app!","Preset wish: recommend this app!"};
    
    
    // On create ....{
    list.addAll(Arrays.asList(wishesArray ));
    
    ArrayAdapter adapter = new ArrayAdapter<String>(this,
                    R.layout.activity_listview, list);
    //.... do the rest normally
    }
    

    当您需要更新数据时:

        list.add(wishSentBack);
        adapter.notifyDataSetChanged();
    

    【讨论】:

    • 已修改,但仍然无法在 onActivityResult 中使用 adapter.notifyDataChanged();,所以我留下了评论... 结果:等待设备时出错:已计时等待模拟器上线 300 秒后退出。 Android Studio 也死了...我会在它重新打开后立即重试
    • 我不得不重启电脑,问题出在我的模拟器上。也解决了适配器的问题,我已经在 onCreate 方法 List&lt;String&gt; list = new ArrayList&lt;&gt;(); ArrayAdapter adapter; 之外声明了列表和适配器,并像您所说的那样在该方法中使用了它们。现在它完美地工作了。谢谢!
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多