Android开发:内部类访问fd变量报错+ListView中Toast无法正常工作
解决ListView点击时Toast失效及内部类访问变量的问题
嘿,我看到你碰到了两个小麻烦:Toast没法正常弹出,还有内部类访问变量的警告,咱们一步步来搞定它们:
问题1:Toast参数顺序完全错了
你写的Toast.makeText(MainActivity.this,"hello",fd.get(position),Toast.LENGTH_LONG).show();参数顺序不对!Toast.makeText()的正确参数顺序是:Toast.makeText(上下文对象, 要显示的文本内容, 显示时长)
你把列表项的内容fd.get(position)放到了第三个参数的位置,而这个位置本来应该放时长参数(比如Toast.LENGTH_LONG),这直接导致Toast无法正常初始化运行。
问题2:内部类访问局部变量的警告
fd是你在onCreate()方法里定义的局部变量,Java规则里,内部类(这里的OnItemClickListener)访问外部局部变量时,要求变量是final类型,或者是Java 8+的「effectively final」(即变量初始化后再也没被修改过)。虽然现在部分编译器支持effectively final,但显式加上final能避免兼容性问题,也能直接消除这个警告。
修正后的完整代码
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ListView list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = findViewById(R.id.List); // 给fd加上final修饰符,消除内部类访问的警告 final ArrayList<String> fd = new ArrayList<String>(); fd.add("roda"); fd.add("ghh"); fd.add("asfff"); fd.add("jll"); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,fd); list.setAdapter(arrayAdapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 修正Toast的参数顺序:把要显示的文本放在第二个位置 // 这里结合了"hello"和列表项内容,你也可以只写fd.get(position) Toast.makeText(MainActivity.this, "hello " + fd.get(position), Toast.LENGTH_LONG).show(); } }); } }
额外小提示
- 要是你不想加
final,也可以把fd提升为Activity的成员变量(放在ListView list;那行下面),这样内部类也能直接访问它。 - 如果你只想显示列表项的内容,那Toast的第二个参数直接写
fd.get(position)就可以,完全根据你的需求调整。
内容的提问来源于stack exchange,提问作者Programmer Hari
相关产品推荐
相关产品推荐

