Android ListView 适配器无法正常工作

Android ListView Adapter not working correctly

我一直在尝试升级我在大学时制作的旧应用程序,包括添加列表视图以显示来自 Last.FM 的数据。这个想法是在它下面有一个带有子文本的主文本,但是我放在一起的适配器不起作用。我尝试了很多选项,最近的选项出现 "Attempt to invoke virtual method on a null object reference" 错误,之前的尝试出现 "Cannot cast Activity to Application" 错误。

相关代码段:

主要 Activity 适配器部分:

ListView lv;

            final Dialog dialog = new Dialog(MainActivity.this);
            dialog.setContentView(R.layout.summarylayout);
            dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT);

            lv = (ListView) dialog.findViewById(R.id.itemList);                 //Listview name

            artistAdapter = new itemAdapter(getApplicationContext(),            //Changed from ArrayAdapter<Item>
                    R.layout.custom_listview,                        //R.layout.custom_listview if itemAdapter works
                    result.toArray(new Item[] {}));


            lv.setAdapter(artistAdapter);

            lv.setOnItemClickListener(new MyOIListener());

            Button closeButton = (Button) dialog
                    .findViewById(R.id.closeBtn);
            // if button is clicked, close the custom dialog
            closeButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    tracks = false;
                    dialog.dismiss();
                }
            });

自定义适配器本身(注释部分是以前的尝试):

public class itemAdapter extends ArrayAdapter<Item>{
Context context;
int layoutResourceId;
Item data[] = null;


public itemAdapter(Context context, int layoutResourceId, Item[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
   // ItemHolder holder = null;
    Item rowIn = new Item();
    TextView main;
    TextView sub;

    if(row == null)
    {
        //LayoutInflater inflater = ((Application)context).getLayoutInflater();
        //row = inflater.inflate(layoutResourceId, parent, false);

        //row = LayoutInflater.from(getActivity()).inflate(R.layout.custom_listview, parent, false);

        LayoutInflater inflater = LayoutInflater.from(this.getContext());
        row = inflater.inflate(layoutResourceId, parent, false);

        //holder = new ItemHolder();
        //rowIn = new Item();
    }
    else
    {
        rowIn = (Item) row.getTag();
    }

    main = (TextView)row.findViewById(R.id.mainText);
    sub = (TextView)row.findViewById(R.id.subText);

    row.setTag(rowIn);

    Item temp = data[position];
    main.setText(temp.getTitle());
    sub.setText(temp.getExtra());

    return row;
}

   /* static class ItemHolder
{
    TextView mainText;
    TextView subText;
}*/

}

"Item" class 只是从 Last.FM api 请求解析的 text/URLs 的持有者。

我知道这是一个经常被问到的问题,但是 3 天的尝试和搜索对我没有太大帮助。任何帮助将不胜感激

您正在将 applicationContext 传递给您的适配器。通过以下方式传递您的 Activity

  artistAdapter = new itemAdapter(MainActivity.this,            //Changed from ArrayAdapter<Item>
                R.layout.custom_listview,                        //R.layout.custom_listview if itemAdapter works
                result.toArray(new Item[] {}));

你的 getView 方法是错误的,实际上你从标签中获取数据时会遇到一个空变量。

这个应该适合你,它正在使用 ViewHolder Pattern

public class itemAdapter extends ArrayAdapter<Item> {
    Context context;
    int layoutResourceId;
    Item data[] = null;


    public itemAdapter(Context context, int layoutResourceId, Item[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ItemHolder holder = null;

        if (convertView == null) {
            //LayoutInflater inflater = ((Application)context).getLayoutInflater();
            //row = inflater.inflate(layoutResourceId, parent, false);

            //row = LayoutInflater.from(getActivity()).inflate(R.layout.custom_listview, parent, false);

            LayoutInflater inflater = ((Activity) this.context).getLayoutInflater();

            convertView = inflater.inflate(layoutResourceId, parent, false);

            holder = new ItemHolder();

            holder.mainText = row.findViewById(R.id.mainText);
            holder.subText = row.findViewById(R.id.subText);

            convertView.setTag(holder);
        } else {
            holder = (ItemHolder) convertView.getTag();
        }

        Item temp = data[position];

        if(temp != null) {
            holder.mainText.setText(temp.getTitle());
            holder.subText.setText(temp.getExtra());
        }
        return convertView;
    }

    static class ItemHolder {
        TextView mainText;
        TextView subText;
    }

}

正如@vinitius 所说,将您的 Activity 上下文传递给适配器。