【问题标题】:Inserting a ListView in an Activity在 Activity 中插入 ListView
【发布时间】:2013-01-08 23:36:47
【问题描述】:

我在将 ListView 插入 Activity 时遇到问题。我刚刚插入了一个从 ListActivity 扩展的列表。这很好用。我也知道如何通过选择一行来转发到另一个活动。但这一次它不起作用。我只是尝试逐行调试所有内容,并始终检查来自 LogCat 的错误消息。我也拉。但现在我不知道该做什么。一切似乎都在正确的地方。

通过记录数据库中的元素(在第二个块中),我发现最后一个元素是空的。因此,我将 for 循环减少了一个。所以整个方法“initVars()”工作,直到它结束,再次返回到“onCreate”块并停止工作。我只是复制错误信息,也许有人知道这是什么意思。

public class ActivityDetail extends Activity {

    TextView tvDefinition, tvDurationSingle, tvDurationMultiplied, tvSubunits;
    ListView lvExecution;
    String executions[];
    ArrayList<Execution> allExecutionsFromDatabase;
    ArrayAdapter<String> adapter;
    UserInformation userInfo = UserInformation.getInstance();
    MyFramework myFramework;

    // Extras from intent
    String definition;
    int activityId, durationSingle, durationMultiplied, subunits;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activitydetail);

    initVars();

}

private void initVars() {

    myFramework = new MyFramework();

    // load extras into variables
    definition = myFramework.getExtrasString("activitiyDefinition",
            getIntent().getExtras());
    activityId = myFramework.getExtrasInt("activityId", getIntent()
            .getExtras());
    durationSingle = myFramework.getExtrasInt("activityDuration",
            getIntent().getExtras());
    subunits = myFramework.getExtrasInt("activitySubunits", getIntent()
            .getExtras());
    durationMultiplied = durationSingle * subunits;

    // init ui elements
    tvDefinition = (TextView) findViewById(R.id.tvActDetailDefinition);
    tvDurationSingle = (TextView) findViewById(R.id.tvActDetailDurationSingle);
    tvDurationMultiplied = (TextView) findViewById(R.id.tvActDetailDurationMultiplied);
    tvSubunits = (TextView) findViewById(R.id.tvActDetailSubunits);
    lvExecution = (ListView) findViewById(R.id.lvActDetail);

    // get executions from db
    ActivityDB entries = new ActivityDB(this);
    entries.open();
    allExecutionsFromDatabase = entries.getSpecificExecutions(
            userInfo.getUserId(), activityId);
    entries.close();

    // set list array to same size as allExecutionsFromDatabase
    executions = new String[allExecutionsFromDatabase.size()];

    // insert definition of each execution in executions for listview
    for (int i = 0; i < allExecutionsFromDatabase.size() - 1; i++) {
        Execution e = new Execution();
        e = allExecutionsFromDatabase.get(i);
        executions[i] = e.getTimestamp();
        Log.e("DEFINITION", "" + e.getTimestamp());
    }

    // init array adapter
    adapter = new ArrayAdapter<String>(ActivityDetail.this,
            android.R.layout.simple_list_item_1, executions);

    // add adapter and onClickListener to listview
    lvExecution.setAdapter(adapter);

    lvExecution.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Toast.makeText(getApplicationContext(),
                    ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            String a = ((TextView) view).getText().toString();
            if (a == "Foo")
                Toast.makeText(getApplicationContext(), "Foobar! xD",
                        Toast.LENGTH_SHORT).show();
        }
    });

}

定位

01-08 23:55:25.361: E/AndroidRuntime(23627): FATAL EXCEPTION: main
01-08 23:55:25.361: E/AndroidRuntime(23627): java.lang.NullPointerException
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at  android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.AbsListView.obtainView(AbsListView.java:1430)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.ListView.makeAndAddView(ListView.java:1745)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.ListView.fillDown(ListView.java:670)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.ListView.fillFromTop(ListView.java:727)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.ListView.layoutChildren(ListView.java:1598)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.AbsListView.onLayout(AbsListView.java:1260)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.View.layout(View.java:7175)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.View.layout(View.java:7175)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.View.layout(View.java:7175)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.View.layout(View.java:7175)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.View.layout(View.java:7175)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.os.Looper.loop(Looper.java:123)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at android.app.ActivityThread.main(ActivityThread.java:3683)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at java.lang.reflect.Method.invokeNative(Native Method)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at java.lang.reflect.Method.invoke(Method.java:507)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-08 23:55:25.361: E/AndroidRuntime(23627):    at dalvik.system.NativeStart.main(Native Method)
01-09 00:00:25.431: I/Process(23627): Sending signal. PID: 23627 SIG: 9

【问题讨论】:

  • 我不知道从哪里开始寻找。部分代码丢失,所以不知道属于哪里。

标签: android listview exception


【解决方案1】:

您没有填充整个 executions 数组:

executions = new String[allExecutionsFromDatabase.size()];

你只迭代直到

for (int i = 0; i < allExecutionsFromDatabase.size() - 1; i++) {

executions 中的最后一个索引条目仍然为空。

这是第一次看到 - 不确定这是否是空指针 exc 的原因,也是唯一的原因:)。

【讨论】:

  • 我刚刚在帖子开头提到,我记录了将从数据库接收到的所有活动。我无法想象为什么还有一个条目,因为我查看了 shell 中的 db 并且没有未定义的位置。所以我只是减少了它,因为我认为它可能由于未定义的活动而导致错误。
  • 好的,你已经解决了这个问题。我减少了从数据库收到的数组大小,因此执行数组中的空太多了,它表示列表的元素。非常感谢。在相同的代码上寻找几个小时你会失去任何动力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多