Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 变量';适配器';从内部类中访问。需要宣布为最终决定_Java_Android_Android Intent - Fatal编程技术网

Java 变量';适配器';从内部类中访问。需要宣布为最终决定

Java 变量';适配器';从内部类中访问。需要宣布为最终决定,java,android,android-intent,Java,Android,Android Intent,变量“adapter”和声明final中存在问题。我的IDE不断告诉我需要将“适配器”声明为final,在哪里以及如何执行?这让我停滞不前,我似乎无法继续前进。请帮忙。此处参考此代码并解决以下问题: package com.example.androidhive; 导入java.util.ArrayList; 导入java.util.HashMap; 导入android.content.Intent; 导入android.widget.TextView; 导入org.w3c.dom.Docume

变量“adapter”和声明final中存在问题。我的IDE不断告诉我需要将“适配器”声明为final,在哪里以及如何执行?这让我停滞不前,我似乎无法继续前进。请帮忙。此处参考此代码并解决以下问题:

package com.example.androidhive;
导入java.util.ArrayList;
导入java.util.HashMap;
导入android.content.Intent;
导入android.widget.TextView;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ListView;
公共类CustomizedListView扩展活动{
//所有静态变量
静态最终字符串URL=”http://imforchange.org/international-movement-for-change/testing/data.xml";
//XML节点密钥
静态最终字符串KEY\u EVENT=“EVENT”//父节点
静态最终字符串键\u ID=“eventId”;
静态最终字符串键\u TITLE=“eventName”;
静态最终字符串键\u DESCRIPTION=“eventDescription”;
静态最终字符串键\u ABSTRACT=“eventAbstract”;
静态最终字符串键\u DATE=“eventDate”;
静态最终字符串键\u PRICE=“eventPrice”;
静态最终字符串键\u LINK=“eventLink”;
静态最终字符串键\u ADDRESS=“eventAddress”;
静态最终字符串键\u CUSTOM\u LINK=“eventCustomlink”;
静态最终字符串键\u PICTURE=“eventPicture”;
静态最终字符串键\u ICON=“eventIcon”;
列表视图列表;
懒散适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList songsList=新的ArrayList();
LazyAdapter=新的LazyAdapter(此,歌曲列表);
XMLParser=新的XMLParser();
字符串xml=parser.getXmlFromUrl(URL);//从URL获取xml
Document doc=parser.getDomeElement(xml);//获取DOM元素
NodeList nl=doc.getElementsByTagName(键事件);
//循环通过所有歌曲节点
对于(int i=0;ivalue
put(KEY_ID,parser.getValue(e,KEY_ID));
put(KEY_TITLE,parser.getValue(e,KEY_TITLE));
map.put(KEY_DESCRIPTION,parser.getValue(e,KEY_DESCRIPTION));
put(KEY_ABSTRACT,parser.getValue(e,KEY_ABSTRACT));
put(KEY_DATE,parser.getValue(e,KEY_DATE));
put(KEY_PRICE,parser.getValue(e,KEY_PRICE));
put(KEY_-LINK,parser.getValue(e,KEY_-LINK));
put(KEY_地址,parser.getValue(e,KEY_地址));
//put(KEY_CUSTOM_LINK,parser.getValue(e,KEY_CUSTOM_LINK));
map.put(KEY_PICTURE,parser.getValue(e,KEY_PICTURE));
map.put(KEY_图标,parser.getValue(e,KEY_图标));
//将哈希列表添加到ArrayList
歌曲列表。添加(地图);
}
list=(ListView)findViewById(R.id.list);
//通过传递xml数据ArrayList获取适配器
adapter=新的LazyAdapter(此,songsList);
list.setAdapter(适配器);
//单击单个列表行的事件
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//获取已单击的项目
HashMap=adapter.getItem(位置);
//开始新的意图
Intent in=newintent(getApplicationContext(),DetailView.class);
in.putExtra(KEY_TITLE,map.get(KEY_TITLE));
in.putExtra(KEY_PICTURE,map.get(KEY_PICTURE));
in.putExtra(KEY_DESCRIPTION,map.get(KEY_DESCRIPTION));
in.putExtra(KEY_PRICE,map.get(KEY_PRICE));
in.putExtra(KEY_链接,map.get(KEY_链接));
星触觉(in);
}
});     
}
}

您没有发布声明变量“adapter”的代码,只是在它前面放了一个“final”修饰符,您应该会没事的。

当您试图在重写方法(例如“onItemClick”方法)中访问外部变量时,您需要使该变量成为final。通过将关键字“final”放在变量声明的前面,可以很容易地实现这一点。另一种方法是使该变量成为成员变量。查看这篇文章,了解更多关于成员变量的信息

这里有三种选择:

  • 将变量适配器设为字段

  • 使变量适配器成为最终的局部变量

  • 将变量适配器复制到另一个最终变量并使用该新变量 内部类中的最终变量


更详细地解释它

当您声明适配器变量时,您将final放在声明的前面。这里引用了以下代码:您发布的内容的区别在于您正在访问click listener中的“adapter”变量,而您发布的链接不是。如果从匿名类内部访问变量,则必须将其声明为final。因此,将其设置为“getView(final int position…)。你可能觉得有点奇怪,但这是合法的。有关为什么需要此最终版本的解释,请参阅@ejobity Don't do that。在你的问题中粘贴相关的代码。@Lewis Therin Hey Lewis,不是为了对抗,但是你为什么不建议简单地将
final
放在getView(…)声明中?
package com.example.androidhive;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Intent;
import android.widget.TextView;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;


public class CustomizedListView extends Activity {
    // All static variables
    static final String URL = "http://imforchange.org/international-movement-for-change/testing/data.xml";

    // XML node keys
    static final String KEY_EVENT = "event"; // parent node
    static final String KEY_ID = "eventId";
    static final String KEY_TITLE = "eventName";
    static final String KEY_DESCRIPTION = "eventDescription";
    static final String KEY_ABSTRACT = "eventAbstract";
    static final String KEY_DATE = "eventDate";
    static final String KEY_PRICE = "eventPrice";
    static final String KEY_LINK = "eventLink";
    static final String KEY_ADDRESS = "eventAddress";
    static final String KEY_CUSTOM_LINK = "eventCustomlink";
    static final String KEY_PICTURE = "eventPicture";
    static final String KEY_ICON = "eventIcon";

    ListView list;
    LazyAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
        LazyAdapter  adapter = new LazyAdapter(this, songsList);

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); // getting XML from URL
        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_EVENT);
        // looping through all song nodes <song>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
            map.put(KEY_DESCRIPTION, parser.getValue(e, KEY_DESCRIPTION));
            map.put(KEY_ABSTRACT, parser.getValue(e, KEY_ABSTRACT));
            map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
            map.put(KEY_PRICE, parser.getValue(e, KEY_PRICE));
            map.put(KEY_LINK, parser.getValue(e, KEY_LINK));
            map.put(KEY_ADDRESS, parser.getValue(e, KEY_ADDRESS));
            //map.put(KEY_CUSTOM_LINK, parser.getValue(e, KEY_CUSTOM_LINK));
            map.put(KEY_PICTURE, parser.getValue(e, KEY_PICTURE));
            map.put(KEY_ICON, parser.getValue(e, KEY_ICON));

            // adding HashList to ArrayList
            songsList.add(map);
        }


        list=(ListView)findViewById(R.id.list);

        // Getting adapter by passing xml data ArrayList
        adapter=new LazyAdapter(this, songsList);
        list.setAdapter(adapter);


        // Click event for single list row
        list.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                    // Get the item that was clicked

                    HashMap<String, String> map = adapter.getItem(position); 
                    // Starting new intent
                    Intent in = new Intent(getApplicationContext(), DetailView.class);
                    in.putExtra(KEY_TITLE, map.get(KEY_TITLE));
                    in.putExtra(KEY_PICTURE, map.get(KEY_PICTURE)); 
                    in.putExtra(KEY_DESCRIPTION, map.get(KEY_DESCRIPTION));
                    in.putExtra(KEY_PRICE, map.get(KEY_PRICE));
                    in.putExtra(KEY_LINK, map.get(KEY_LINK));
                    startActivity(in);
                }
        });     
    }
}