列表片段onItemClick无法正常工作。

时间:2015-11-04 20:36:47

标签: java android android-fragments

我有一个包含食谱列表的片段。但我无法让onItemClick工作...... 我已经用onListItemClick尝试了它,但它似乎也没有用。

我的片段

public class RecipeBookListViewFragment extends ListFragment implements AdapterView.OnItemClickListener {

private List<Recipe> recipes;
private  DataPassListener mCallback;
private ListView recipeList;

public interface DataPassListener{
    public void passData(Recipe recipe);
}


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    RecipeBookActivity.CONTEXT = getActivity().getApplicationContext();

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_recipeitem_list, container, false);
    return view;
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    fillRecipeBook();
    getListView().setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
    Recipe recipe = (Recipe) getListAdapter().getItem(position);
    final ProgressDialog dialog = ProgressDialog.show(getActivity(), "", "halloooooo...");

    mCallback.passData(recipe);
}

@Override
public void onViewCreated(View v, Bundle savedInstanceState){
    super.onViewCreated(v,savedInstanceState);

    recipeList = getListView();
    recipeList.setClickable(true);
}


@Override
public void onAttach(Activity activity){
    super.onAttach(activity);

    try {
        mCallback = (DataPassListener)activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement DataPassListener");
    }
}

private void fillRecipeBook(){

    final ProgressDialog dialog = ProgressDialog.show(getActivity(), "", "loading...");
    RestClient.ApiInterface service = RestClient.getClient();
    Call<List<Recipe>> call = service.recipes();
    call.enqueue(new Callback<List<Recipe>>() {
        @Override
        public void onResponse(Response<List<Recipe>> response, Retrofit retrofit) {
            dialog.dismiss();
            Log.d("MainActivity", "Status Code = " + response.code());
            if (response.isSuccess()) {
                // request successful (status code 200, 201)
                recipes = response.body();
                ArrayAdapter<String> adapter = new RecipeListAdapter(getActivity(), recipes);

                setListAdapter(adapter);

            } else {
                // response received but request not successful (like 400,401,403 etc)
                //Handle errors
            }
        }

        @Override
        public void onFailure(Throwable t) {
            Log.d("MainActivity", "GOE KAPOT " + t.getMessage());
            dialog.dismiss();
        }
    });


}
}

我的ListView.xml

<?xml version="1.0" encoding="utf-8"?>

<ListView android:id="@android:id/list" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="#FFCC00"
    android:dividerHeight="2dp"/>

<TextView android:id="@+id/recipe_title" android:layout_width="match_parent"
    android:layout_height="match_parent" android:gravity="left"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"/>

我的自定义适配器

public class RecipeListAdapter extends ArrayAdapter{

private Context context;
private boolean useList = true;
private List<Recipe> recipes;

public RecipeListAdapter(Context context, List<Recipe> recipes) {
    super(context,-1, recipes);
    this.context = context;
    this.recipes = recipes;
}

private class ViewHolder{
    TextView titleText;
}


public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    Recipe recipe = (Recipe)getItem(position);
    View viewToUse;


    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        if(useList){
            viewToUse = mInflater.inflate(R.layout.fragment_recipeitem_list, null);
        } else {
            viewToUse = mInflater.inflate(R.layout.fragment_recipeitem_grid, null);
        }

        holder = new ViewHolder();
        holder.titleText = (TextView)viewToUse.findViewById(R.id.recipe_title);
        viewToUse.setTag(holder);
    } else {
        viewToUse = convertView;
        holder = (ViewHolder) viewToUse.getTag();
    }

    holder.titleText.setText(recipe.getTitle());
    return viewToUse;
}

}

我的主要活动:

public class RecipeBookActivity extends Activity implements DataPassListener {

public static Context CONTEXT;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recipe);


    if(findViewById(R.id.recipe_list_fragment) != null){
        if (savedInstanceState != null)
            return;

        RecipeBookListViewFragment recipeBookListViewFragmentFragment = new RecipeBookListViewFragment();
        recipeBookListViewFragmentFragment.setArguments(getIntent().getExtras());
        getFragmentManager().beginTransaction().add(R.id.recipe_list_fragment,
                recipeBookListViewFragmentFragment).commit();

    }
}

@Override
public void passData(Recipe recipe){
    RecipeFragment recipeFragment = new RecipeFragment();
    Bundle args = new Bundle();

    args.putSerializable(recipeFragment.DATA_RECEIVE, recipe);
    recipeFragment.setArguments(args);

    getFragmentManager().beginTransaction()
            .replace(R.id.recipe_list_fragment, recipeFragment)
            .commit();
}
}

1 个答案:

答案 0 :(得分:0)

您需要先将onItemClickListener设置为ListView,然后才能注册任何点击。将您的onViewCreated代码更改为:

@Override
public void onViewCreated(View v, Bundle savedInstanceState){
    super.onViewCreated(v,savedInstanceState);

    recipeList = getListView();
    recipeList.setOnItemClickListener(this);
}

这样,任何单击ListView的项目都将在Fragment中覆盖的onItemClick()方法中处理。