簡體   English   中英

由於嘗試調用虛擬方法'java.lang.String android.content.Context.getPackageName(),因此意圖失敗

[英]Intent fails because of Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()

我所擁有的:我有一個帶有酒吧,咖啡店圖像的RecyclerView。 等等

我想要的是:當您單擊這些圖像之一時,我會向您顯示所選位置的信息,但是在您單擊所選圖像的那一刻,應用程序崩潰並顯示此錯誤“嘗試調用虛擬方法' java.lang.String android.content.Context.getPackageName()我創建Intent的行上的java.lang.String android.content.Context.getPackageName() '在空對象引用上”。 我已經在尋找這個錯誤,但我正在按照他們所說的去做

我的問題:該如何解決? 拜托,我非常感謝帶有代碼的示例,我還不擅長編程,請先謝謝

我的java課

    public class foodAndGo extends AppCompatActivity {
    ArrayList<ClaseNueva> listalugares;
    RecyclerView recyclerview;

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

       listalugares = new ArrayList<ClaseNueva>();
       recyclerview = (RecyclerView) findViewById(R.id.RecyclerID);
       recyclerview.setLayoutManager(new LinearLayoutManager(this));

       llenarLugares();

       AdapterDatos adapter = new AdapterDatos(foodAndGo.this, listalugares);
       recyclerview.setAdapter(adapter);

    }

    private void llenarLugares() {
        listalugares.add(new ClaseNueva("Restaurantes", R.drawable.carnemejor));
        listalugares.add(new ClaseNueva("Bares", R.drawable.beers));
        listalugares.add(new ClaseNueva("Cafeterías", R.drawable.desayunosmejor));
        listalugares.add(new ClaseNueva("Pizzerías", R.drawable.pizzaamejor));
        listalugares.add(new ClaseNueva("Favoritos", R.drawable.favoritosmejo));

    }
}

我的適配器

    public class AdapterDatos extends RecyclerView.Adapter<AdapterDatos.ViewHolder> {


    ArrayList<ClaseNueva>listalugares;
    Context context;

    public AdapterDatos(foodAndGo foodAndGo, ArrayList<ClaseNueva> listalugares) {
        this.context = context;
        this.listalugares = listalugares;
    }


    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {//quizas poner esto en estatic
        TextView etiNombre;
        ImageView foto;

//        Context context;

        public ViewHolder(View itemView) {
            super(itemView);
//            context = itemView.getContext();

            etiNombre = (TextView) itemView.findViewById(R.id.idNombre);
            foto = (ImageView) itemView.findViewById(R.id.idImagen);
        }
        void setOnClickListeners(){
            foto.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
//            switch (v.getId()){
//                case R.id.idImagen:
//                    Intent intent = new Intent(context, MapsActivity.class);
//                    context.startActivity(intent);
//                    break;
//            }

        }
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,null,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.etiNombre.setText(listalugares.get(position).getNombre());
        holder.foto.setImageResource(listalugares.get(position).getFoto());

//        holder.setOnClickListeners();
       if (position == 0){
           holder.foto.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   Intent myIntent = new Intent(context, MapsActivity.class);
                   context.startActivity(myIntent);
               }
           });
       }
    }

    @Override
    public int getItemCount() {
        return listalugares.size();
    }

}

我認為您忘記了通過活動傳遞上下文!

AdapterDatos adapter = new AdapterDatos(foodAndGo.this,listalugares);

在適配器中接收上下文:

public AdapterDatos(Context context , ArrayList<ClaseNueva> listalugares) {
        this.context = context;
        this.listalugares = listalugares;
    }

希望對您有所幫助!

您需要在適配器中獲取上下文。 我有另一個解決方案。 您可以使用以下代碼獲取上下文

context = holder.foto.getContext();

因此,我們將從適配器中的foto組件獲取上下文。 我們試試吧!

更新

您需要將該代碼放在onBindViewHolder及更高版本中

if (position == 0){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM