2015-11-04 41 views
0

我有一個食譜列表的片段。但我不能讓onItemClick工作... 我已經嘗試了onListItemClick,但似乎也沒有工作。列表片段onItemClick不起作用。

我的片段

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(); 
} 
} 
+0

什麼不起作用? – AdamMc331

+0

我無法點擊我列表中的項目... – KevinVerleysen

回答

0

您需要的onItemClickListener設置到ListView,纔可以註冊任何點擊。您onViewCreated代碼更改爲:

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

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

這樣的ListView中的任何項目的點擊將在在片段overidden的onItemClick()方法來處理。

+0

我把它放在onViewCreated中,但它仍然可以啓用我的項目上的點擊功能。 – KevinVerleysen

+0

好吧,很明顯,它確實按照你告訴我的方式工作。此外,我需要設置我的TextView可點擊:false。 這個問題似乎是我的ListFragment的性能。它需要幾秒鐘,甚至幾分鐘來加載我的其他片段,當點擊一個項目。 – KevinVerleysen