漫随天外云卷云舒(๑´∀`๑) 2020-04-14 17:34 采纳率: 0%
浏览 231

Android studio中ListViewTest项目出现“非静态方法setOnltemClickListener不能从静态引用”错误,怎么改?在线求各位大佬解惑!万分感谢!

来源:


《第一行代码》第二版p121页
ListViewTest项目中ListView的点击事件
书中版本:Android studio2.2
我的版本:Android studio3.5
。

代码说明:


使用 setonItemClicklistener()方法为 Listview注册了一个监听器,
当用户点击了 List view中的任何一个子项时,就会回调 onItemclick()方法。
在这个方法中可以通过 position参数判断出用户点击的是哪一个子项,
然后获取到相应的水果,并通过 Toast将水果的名字显示出来。
。

错误:

图片说明

图片说明

图片说明

完整代码:

package com.example.listviewtest;

import androidx.appcompat.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;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<Fruit> fruitList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initFruits();//初始化水果数据
        FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);

        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);

        //Listview响应点击事件
        ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Fruit fruit = fruitList.get(position);
                Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT.show());
            }
        });
    }
//可以看到,我们使用 setonItemClicklistener()方法为 Listview注册了一个监听器,当
//用户点击了 List view中的任何一个子项时,就会回调 onItemclick()方法。在这个方法中可以
//通过 position参数判断出用户点击的是哪一个子项,然后获取到相应的水果,并通过 Toast将
//水果的名字显示出来。
    private void initFruits(){
        for(int i=0;i<2;i++){
            Fruit apple = new Fruit("Apple",R.drawable.apple_pic);
            fruitList.add(apple);
            Fruit banana = new Fruit("banana",R.drawable.banana_pic);
            fruitList.add(banana);
            Fruit orange = new Fruit("orange",R.drawable.orange_pic);
            fruitList.add(orange);
            Fruit watermelon = new Fruit("watermelon",R.drawable.watermelon_pic);
            fruitList.add(watermelon);
            Fruit pear = new Fruit("pear",R.drawable.pear_pic);
            fruitList.add(pear);
            Fruit grape = new Fruit("grape",R.drawable.grape_pic);
            fruitList.add(grape);
            Fruit pineapple = new Fruit("pineapple",R.drawable.pineapple_pic);
            fruitList.add(pineapple);
            Fruit strawberry = new Fruit("strawberry",R.drawable.strawberry_pic);
            fruitList.add(strawberry);
            Fruit cherry = new Fruit("cherry",R.drawable.cherry_pic);
            fruitList.add(cherry);
            Fruit mango = new Fruit("mango",R.drawable.mango_pic);
            fruitList.add(mango);

        }
    }
//可以看到,这里添加了一个 initFruits()方法,用于初始化所有的水果数据。在 Fruit类
//的构造函数中将水果的名字和对应的图片id传入,然后把创建好的对象添加到水果列表中。另
//外我们使用了一个for循环将所有的水果数据添加了两遍,这是因为如果只添加一遍的话,数据
//量还不足以充满整个屏幕。接着在 on create()方法中创建了 FruitAdapter对象,并将 Fruit
//Adapter作为适配器传递给 List view,这样定制 List view界面的任务就完成了。

        public class Fruit {
            private String name;
            private int imageId;

        public Fruit(String name,int imageId){
            this.name = name;
            this.imageId = imageId;
        }

        public String getName(){
            return  name;
        }
        public  int getImageId(){
            return  imageId;
        }
    }//Fruit类中只有两个字段,name表示水果的名字, imageId表示水果对应图片的资源id
}

理论上的效果图:(点击orange,出现如图弹窗)

图片说明

在线求各位大佬解惑!多谢!

  • 写回答

1条回答 默认 最新

  • qq_1113502097 2020-04-15 09:41
    关注

    你的错误在.show(),写法是
    Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
    shou方法应该在括号外面

    listview的点击事件是匿名内部类,你可以把它写到外面来。或者在点击方法中添加

    if( parent.getContext () instanceof MainActivity ){
    ((MainActivity)parent.getContext ()).sendToast(fruit.getName())
    }
    

    然后在对应的活动中写sendToast()方法

    public void sendToast(String s){
    Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
    }
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问