在 ArrayAdapter 中启动片段

Starting a Fragment Inside ArrayAdapter

我有一个用 ArrayAdapter 填充的 gridview。在 GridView 中,我有一个 Button 和 ImageView。我为按钮和图像创建了一个监听器,但是我想在点击 ImageView 后启动一个片段。我在使用 getSupportFragmentManager() 时遇到了错误;。

holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            DetailsFragment fragment = new DetailsFragment();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }
    });

更新

这是我的 ArrayAdapter 代码 Class

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.squareup.picasso.Picasso;

import java.util.List;


public class MyAdapter extends ArrayAdapter<RowItem> {
    Context context;
    int imgId;



public MyAdapter(Context context, int resourceId, List<RowItem> items){
    super(context, resourceId, items);
    this.context = context;
}


private class ViewHolder{
    ImageView imageView;
    Button btn;
    TextView textView;
}

public View getView(int position, View convertView, ViewGroup parent){
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater inflater = (LayoutInflater)        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null){
        convertView = inflater.inflate(R.layout.grid_item, null);
        holder = new ViewHolder();
        holder.imageView = (ImageView) convertView.findViewById(R.id.img);
        holder.btn = (Button) convertView.findViewById(R.id.btnPocket);
        holder.textView = (TextView) convertView.findViewById(R.id.tv);
        convertView.setTag(holder);
    }
    else
        holder = (ViewHolder) convertView.getTag();

    Picasso.with(context)
            //.load("http://www.balay-indang.com/megamobile/pics/"+   String.valueOf(position+1) +".png")
            .load(rowItem.getImgUrl())
            .resize(200,150)
            .centerCrop()
            .into(holder.imageView);
    holder.textView.setText(rowItem.getText());
    holder.btn.setBackgroundResource(rowItem.getPocketId());

    final String pos = String.valueOf(position);

    holder.btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getContext(), "Pocket: "+ pos,   Toast.LENGTH_LONG).show();
        }
    });
    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction =   fragmentManager.beginTransaction();
            DetailsFragment fragment = new DetailsFragment();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }
    });

    return convertView;

}

}

你现在的activity是"Fragment"activity吗?

您的 activity 需要扩展并且 Activity 继承自 FragmentActivity 以获得 getSupportFragmentManager() 和其他支持方法可用的。

在我回答时,您的 activity 应该扩展 AppCompatActivity。还要确保相关导入使用类如

的支持
android.support.v4.app.FragmentManager 

您只能从 FragmentActivity class 访问 getSupportedFragmentManager。 如果您必须在适配器中访问 getSupportedFragmentManager,那么您已经通过构造函数传递了 activity 的实例。

getSupportFragmentManager() 仅为 class FragmentActivity 定义。

编辑:

如果您的 MainActivity 扩展了 ActionBarActivity,那么试试这个。

holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = ((ActionBarActivity) context).getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            DetailsFragment fragment = new DetailsFragment();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }
    });

希望对您有所帮助!