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