【问题标题】:ListView with an ArrayAdapter带有 ArrayAdapter 的 ListView
【发布时间】:2019-03-17 04:39:02
【问题描述】:

我正在尝试为我的 ListView 创建一个 ArrayAdapter 以显示联系人列表,但它表示它无法解析数组适配器的构造函数。请有人帮助我并告诉我是否需要创建自定义适配器。我也尝试过 ArrayAdapter> 但这也不能解决构造函数。这是我的代码:

package com.example.contactmanagement;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final int ADDCONTACT_REQUEST_CODE = 0;
    int idCounter = 0;
    List<Bundle> contacts = new ArrayList<Bundle>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        Bundle bundle = data.getExtras();
        contacts.add(bundle);
        String fname = bundle.getString("fname");
        String lname = bundle.getString("lname");
        String full_name = fname + " " + lname;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout layout = (LinearLayout) findViewById(R.id.contactList);

        ArrayAdapter<List> itemsAdapter = new ArrayAdapter<List>(this, R.layout.textview, contacts);
        ListView listView = (ListView) findViewById(R.id.lv);
        listView.setAdapter(itemsAdapter);
        /*
        TextView textView = new TextView(this);
        textView.setLayoutParams(params);
        textView.setText(fname +" " + lname);
        textView.setId(idCounter);
        idCounter++;
        textView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Intent contactDetails = new Intent("com.example.contactmanagement.ContactDetails");
                int counterID = v.getId();
                Bundle bundleToPass = contacts.get(counterID);
                contactDetails.putExtras(bundleToPass);
                startActivity(contactDetails);
            }
        });
        layout.addView(textView);
        */
    }
    public void onClick(View view) {
        Intent intent = new Intent(this, AddContact.class);
        startActivityForResult(intent, ADDCONTACT_REQUEST_CODE);
    }

}

【问题讨论】:

  • 嘿,试试你的代码,将数组适配器声明为 string.ArrayAdapter itemsAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items);

标签: java android android-listview android-arrayadapter


【解决方案1】:

改变这一行:

ArrayAdapter<List> itemsAdapter = new ArrayAdapter<List>(this, R.layout.textview, contacts);

到这里:

ArrayAdapter<Bundle> itemsAdapter = new ArrayAdapter<Bundle>(this, R.layout.textview, contacts);

对于ArrayAdapter,放置在 之间的类型就是用于数组的类型。

在这种情况下,您的List 实际上是一个Bundle 列表,这意味着联系人 只是一个Bundle 类型的列表。

因此,您放置在 中的类型必须是 Bundle 类型,以匹配您的联系人列表的类型。

您收到构造函数错误的原因是因为您编写了 ArrayAdapter&lt;List&gt;,因此构造函数期望 contactsArrayList 类型的 List

还有一点需要注意的是……

您的 ArrayAdapter 可能不会给您期望的输出,因为它不知道如何处理 Bundle

如果它只是String 的列表,那么它会知道将其显示到R.layout.textview 的布局中,但对于Bundle 类型,它根本不知道你想用它做什么除非您创建一个自定义适配器来处理这种类型。

因此,您可以创建一个自定义适配器,让您的 ListView 知道如何显示 Bundle 的内容,如果您的信息足够简单,就像一个字符串,然后您可以创建一个仅包含该简单字符串的新列表,并将其传递给 ArrayAdapter 的构造函数。

【讨论】:

  • 谢谢!它工作得很好。现在是弄清楚如何解压这个包的困难部分
  • 如果回答了您的问题,请接受正确的答案。
  • 对于您来说,这只能通过自定义适配器来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多