Android ListView适配器无法正常工作

时间:2015-03-12 21:46:44

标签: java android listview android-listview android-arrayadapter

我一直在尝试升级我在大学里制作的旧应用,包括添加listview来显示Last.FM中的数据。这个想法是在它下面有一个带有子文本的主文本,但是我放在一起的适配器不起作用。我尝试了很多选项,最近的一个是“尝试在空对象引用上调用虚方法”错误,之前的尝试得到了“无法将活动转换为应用程序”错误。

相关代码部分:

主要活动适配器部分:

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”类只是从Last.FM api请求解析的文本/ URL的持有者。

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

2 个答案:

答案 0 :(得分:0)

您已将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[] {}));

答案 1 :(得分:0)

你的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上下文传递给适配器。