Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android ListView适配器工作不正常_Java_Android_Listview_Android Listview_Android Arrayadapter - Fatal编程技术网

Java Android ListView适配器工作不正常

Java Android ListView适配器工作不正常,java,android,listview,android-listview,android-arrayadapter,Java,Android,Listview,Android Listview,Android Arrayadapter,我一直在尝试升级我在大学时制作的一个旧应用程序,包括添加一个listview来显示Last.FM中的数据。这个想法是有一个主文本和它下面的潜文本,但我放在一起的适配器就是不工作。我已经尝试了很多选项,最近的一次是“尝试在空对象引用上调用虚拟方法”错误,之前的一次尝试出现了“无法将活动强制转换为应用程序”错误 相关代码部分: 主要活动适配器部分: ListView lv; final Dialog dialog = new Dialog(MainActivity.this

我一直在尝试升级我在大学时制作的一个旧应用程序,包括添加一个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();
                }
            });
ListView-lv;
最终对话框=新对话框(MainActivity.this);
setContentView(R.layout.summarylayout);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_父项,
WindowManager.LayoutParams.MATCH\u(父项);
lv=(ListView)dialog.findViewById(R.id.itemList)//列表视图名称
artistAdapter=new itemAdapter(getApplicationContext(),//已从ArrayAdapter更改
R.layout.custom_列表视图,//R.layout.custom_列表视图(如果itemAdapter工作)
结果.toArray(新项目[]{});
lv.设置适配器(artistAdapter);
lv.setOnItemClickListener(新MyOIListener());
按钮关闭按钮=(按钮)对话框
.findviewbyd(R.id.closeBtn);
//如果单击按钮,则关闭自定义对话框
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
轨迹=假;
dialog.dismise();
}
});
自定义适配器本身(注释部分是以前的尝试):

公共类itemAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
物料数据[]=null;
公共项适配器(上下文上下文,int-layoutResourceId,项[]数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
//ItemHolder=null;
Item rowIn=新项();
文本视图主视图;
文本视图子程序;
if(行==null)
{
//LayoutInflater充气器=((应用程序)上下文)。getLayoutInflater();
//行=充气机。充气(layoutResourceId,父级,false);
//row=LayoutInflater.from(getActivity()).flate(R.layout.custom_listview,parent,false);
LayoutInflater充气器=LayoutInflater.from(this.getContext());
行=充气机。充气(layoutResourceId,父级,false);
//holder=新的ItemHolder();
//rowIn=新项();
}
其他的
{
rowIn=(项)row.getTag();
}
main=(TextView)row.findViewById(R.id.mainText);
sub=(TextView)row.findViewById(R.id.subText);
row.setTag(rowIn);
项目温度=数据[位置];
main.setText(temp.getTitle());
sub.setText(temp.getExtra());
返回行;
}
/*静态类项目持有者
{
文本视图主文本;
文本视图潜文本;
}*/
}
“Item”类只是从最后一个.FM api请求解析的文本/URL的持有者


我意识到这是一个经常被问到的问题,但3天的尝试和搜索并没有给我太多帮助。如果您将
应用程序上下文
传递到适配器,将不胜感激。通过以下方式传递您的
活动

  artistAdapter = new itemAdapter(MainActivity.this,            //Changed from ArrayAdapter<Item>
                R.layout.custom_listview,                        //R.layout.custom_listview if itemAdapter works
                result.toArray(new Item[] {}));
artistAdapter=newItemAdapter(MainActivity.this,//已从ArrayAdapter更改
R.layout.custom_列表视图,//R.layout.custom_列表视图(如果itemAdapter工作)
结果.toArray(新项目[]{});

您的getView方法是错误的,实际上,从标记获取数据时,您将面临一个空变量

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

公共类itemAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
物料数据[]=null;
公共项适配器(上下文上下文,int-layoutResourceId,项[]数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ItemHolder=null;
if(convertView==null){
//LayoutInflater充气器=((应用程序)上下文)。getLayoutInflater();
//行=充气机。充气(layoutResourceId,父级,false);
//row=LayoutInflater.from(getActivity()).flate(R.layout.custom_listview,parent,false);
LayoutInflater充气器=((活动)this.context).getLayoutInflater();
convertView=充气机。充气(layoutResourceId,父项,false);
holder=新的ItemHolder();
holder.mainText=row.findViewById(R.id.mainText);
holder.subText=row.findviewbyd(R.id.subText);
convertView.setTag(支架);
}否则{
holder=(ItemHolder)convertView.getTag();
}
项目温度=数据[位置];
如果(温度!=null){
holder.mainText.setText(temp.getTitle());
holder.subText.setText(temp.getExtra());
}
返回视图;
}
静态类项目持有者{
文本视图主文本;
文本视图潜文本;
}
}

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

嘿,成功了!我一辈子都搞不清楚这两者之间的关系。如果您不介意的话,getApplicationContext()与MainActivity之间有什么问题?这两个实例都来自
Context
,但应用程序上下文关注应用程序生命周期,而活动关注活动的生命周期。一个无法访问另一个的相同属性
  artistAdapter = new itemAdapter(MainActivity.this,            //Changed from ArrayAdapter<Item>
                R.layout.custom_listview,                        //R.layout.custom_listview if itemAdapter works
                result.toArray(new Item[] {}));
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;
    }

}