【问题标题】:Start Activity from BaseAdapter type class从 BaseAdapter 类型类启动 Activity
【发布时间】:2014-11-01 04:06:03
【问题描述】:

当我从列表中选择项目时,我的应用程序不断崩溃。我已经尝试了以前关于这个问题的问题中可用的所有内容。我知道这个问题与意图和上下文有关。我似乎无法弄清楚为什么这不起作用。有的请帮忙

package com.example.f4f;


import java.util.ArrayList;



import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class RecipesAdapter extends BaseAdapter implements OnClickListener{

private Context context;
private MainActivity activity;
private LayoutInflater layoutInflater;
private ArrayList<Recipes> recipes;

public RecipesAdapter(Context context){
    this.context = context;
}

public RecipesAdapter (MainActivity a, LayoutInflater l, ArrayList<Recipes> data)
{
    this.activity = a;
    this.layoutInflater = l;
    this.recipes = data;
}

@Override
public int getCount(){
    return this.recipes.size();
}

@Override
public boolean areAllItemsEnabled ()
{
    return true;
}

@Override
public Object getItem(int arg0){
    return null;
}

@Override
public long getItemId(int pos) {
    return pos;
}

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    MyViewHolder holder;
    if (convertView == null) {
        convertView = layoutInflater.inflate (R.layout.list_items, parent, false);

        View myView = (View) convertView.findViewById(R.id.listitem);

        if(pos % 2 == 0){
            myView.setBackgroundColor(Color.parseColor("#d3d3d3"));
        }
        holder = new MyViewHolder();
        holder.recipeName = (TextView) convertView.findViewById(R.id.textView1);
        holder.rating = (TextView) convertView.findViewById(R.id.textView2);
        //holder.storyDesp = (TextView) convertView.findViewById(R.id.textView3);
        convertView.setTag(holder);
    }
    else {
        holder = (MyViewHolder) convertView.getTag();
    }

    convertView.setOnClickListener(this);

    Recipes recipe = recipes.get(pos);
    holder.recipe = recipe;
    holder.recipeName.setText(recipe.getrecipeName());
    holder.rating.setText(recipe.getRating());
    //holder.storyDesp.setText(news.getDesp());

    return convertView;
}

@Override
public void onClick(View v) {
    MyViewHolder holder = (MyViewHolder) v.getTag();
    if (v instanceof View) {
        //String selectedrecipe = holder.recipe.getID();
        //String selectedrecipeurl = "http://www.yummly.com/recipe/external/"+selectedrecipe;
        //Uri uri = Uri.parse("http://www.yummly.com/recipe/external/"+selectedrecipe);
        Intent intent = new Intent(this.context, SelectedRecipeWebView.class);
        //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

}
public static class MyViewHolder {
    public TextView recipeName, rating;
    public Recipes recipe;
}


}

09-08 01:10:05.933: D/dalvikvm(3346): GC_FOR_ALLOC 释放 21K,3% 释放 3931K/4028K,暂停 2ms,总共 2ms 09-08 01:10:05.933: D/dalvikvm(3346): GC_FOR_ALLOC 释放 5K,3% 释放 4147K/4252K,暂停 2ms,总共 2ms 09-08 01:10:05.937: I/dalvikvm-heap(3346): 将堆(碎片情况)增加到 6.537MB,分配 2536932 字节 09-08 01:10:05.941: D/dalvikvm(3346): GC_FOR_ALLOC 释放

【问题讨论】:

  • 有人可以帮我解决这个问题吗?我尝试将上下文上下文添加到: public RecipesAdapter (MainActivity a, LayoutInflater l, ArrayList data) { this.activity = a; this.layoutInflater = l; this.recipes = 数据; }

标签: java android


【解决方案1】:

您只在RecipesAdapter(上下文上下文)中初始化了上下文。如果您在创建 RecipesAdapter 的实例时未使用此构造函数,则您的上下文在被引用时具有空值。你需要初始化这个值。

从这个类的外观来看,您似乎使用了另一个构造函数。我推断这是因为您的 layoutInflater 已设置,显然您对此没有任何问题。

编辑:要传递当前上下文的实例,您可以将构造函数中的活动字段替换为 RecipesAdapter(Context context, LayoutInflater l, ArrayList data)。我这么说是因为这是完成此操作的正常方式(也因为您似乎没有在任何地方使用您的 MainActivity 字段)。

【讨论】:

  • 如何初始化上下文值
  • 您能否查看我编辑的答案,看看是否能解决您的问题?
  • 我在 MainActivity.java 类中调用了 RecipesAdapter 构造函数,所以我认为我不能将其删除,并用上下文上下文替换它
  • 是的,你可以。将构造函数中的 Context 传递给自定义适配器的原因是,将调用它的活动的上下文传递给它。请参阅developer.android.com/reference/android/widget/… 中的构造函数。这是您最初初始化自定义适配器的方式。你传递的“this”是构造函数
  • 我将构造函数更改为 public RecipesAdapter (Context context, LayoutInflater l, ArrayList data) { this.context = context; //this.activity = a; this.layoutInflater = l; this.recipes = 数据; } 应用仍在崩溃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多