2

, поэтому перед последним обновлением я использую onListItemClick-слушатель, и он отлично работает, но теперь я попытался использовать RecyclerView, и я не уверен, как реализовать onClick для каждого элемента, который откроется новый вид деятельности ..RecyclerView onListItemНажмите, чтобы создать новое намерение

это то, что я использовал, чтобы иметь

public class SermonsFragment extends Fragment { 

    @Override 
    public void onListItemClick(ListView list, View v, int position, long id) { 
     Intent mediaStreamIntent = new Intent(getActivity(), MediaStreamPlayer.class); 
     mediaStreamIntent.putExtra("sermon_details", (android.os.Parcelable) list.getItemAtPosition(position)); 
     startActivity(mediaStreamIntent); 
    } 
} 

но теперь, вместо того, чтобы использовать ListView создать адаптер проповедей, и это выглядит, как это

public class SermonListAdapter extends RecyclerView.Adapter<SermonListAdapter.ViewHolder>{ 
    private ArrayList<Sermon> mDataset; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    //Note: need to remove static class no idea why 
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     // each data item is just a string in this case 
     public View mView; 
     public ViewHolder(View v) { 
      super(v); 
      v.setOnClickListener(this); 
      mView = v; 
     } 

     @Override 
     public void onClick(View v) { 
      Log.d("SermonsListAdapter.java.debug", "itemClick " + mDataset.get(getPosition()).getName()); 

     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public SermonListAdapter(ArrayList<Sermon> myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public SermonListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.sermon_cardview, parent, false); 
     // set the view's size, margins, paddings and layout parameters 

     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     TextView title = (TextView) holder.mView.findViewById(R.id.sermon_title); 
     TextView series = (TextView) holder.mView.findViewById(R.id.sermon_series); 
     TextView pastor = (TextView) holder.mView.findViewById(R.id.sermon_pastor); 
     TextView sermonDate = (TextView) holder.mView.findViewById(R.id.sermon_date); 

     title.setText(mDataset.get(position).getName()); 
     series.setText(mDataset.get(position).getSeries()); 
     pastor.setText(mDataset.get(position).getPastor()); 
     sermonDate.setText(mDataset.get(position).getSermonDate()); 

    } 

и фрагмент является более или менее то же самое, это просто я не могу использовать onListItemClick больше

public class SermonsFragment extends Fragment { 
     private static final int MAX_SERMONS_LIST = 20; 
     private ArrayAdapter<Sermon> listAdapter; 
     private String imageUrl; 
     private static String sermonListJSONUrl = “http://someurl”; 

     private RecyclerView mRecyclerView; 
     private RecyclerView.Adapter mAdapter; 
     private RecyclerView.LayoutManager mLayoutManager; 

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

      //Check if there is internet, if yes call JSONParser 
      ConnectionDetector myConnection = new ConnectionDetector(getActivity().getApplicationContext()); 
      Boolean isInternetOnline = false; 
      isInternetOnline = myConnection.isConnectingToInternet(); 

      if(isInternetOnline) { 
       //Call JSONParser Asynchronously to get sermonList in JSON Format 
       new callJSONParserAsync().execute(sermonListJSONUrl); 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_sermons, container, false); 
      mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view); 
      return rootView; 
     } 

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

      mLayoutManager = new LinearLayoutManager(getActivity()); 
      mRecyclerView.setLayoutManager(mLayoutManager); 
      mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

      //Just an Empty Class 
      ArrayList<Sermon> mySermon = new ArrayList<Sermon>(); 

      //specify an adapter 
      mAdapter = new SermonListAdapter(mySermon); 
      mRecyclerView.setAdapter(mAdapter); 
     } 

У меня есть cardview XML выглядеть следующим образом

<!-- A CardView that contains a TextView --> 
<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view" 
    android:layout_margin="5dp" 
    android:layout_width="match_parent" 
    android:layout_height="100dp" 
    card_view:cardCornerRadius="1dp"> 

    <LinearLayout android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:id="@+id/sermon_title" /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:id="@+id/sermon_series" /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:id="@+id/sermon_pastor" /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:id="@+id/sermon_date" /> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

У меня эта ошибка при попытке создать новое намерение

12-18 22:31:48.469 31887-31887/org.ifgfseattle.ifgfseattle E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: org.ifgfseattle.ifgfseattle, PID: 31887 
    android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
      at android.app.ContextImpl.startActivity(ContextImpl.java:1232) 
      at android.app.ContextImpl.startActivity(ContextImpl.java:1219) 
      at android.content.ContextWrapper.startActivity(ContextWrapper.java:322) 
      at org.ifgfseattle.ifgfseattle.adapter.SermonListAdapter$1.onClick(SermonListAdapter.java:81) 
      at android.view.View.performClick(View.java:4756) 
      at android.view.View$PerformClick.run(View.java:19749) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

ответ

12

Вы можете реализовать onClick на виду в вашем onBindViewHolder методе внутри adpater.

  1. Присвоить идентификатор к виду, который содержит пункт ячейку
  2. Получить вид именно так, как у вас есть для TextViews
  3. установить OnClick в корень внутри метода, как это:

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
        viewHolder.relLayout.setOnClickListener(new OnClickListener(){ 
         public void onClick(View v) { 
          // perform your operations here 
         } 
        }); 
    } 
    

EDIT:

Это как присвоить идентификатор в XML

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/lnrLayout" ---------->> This is new 
    android:orientation="vertical"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:id="@+id/sermon_title" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:id="@+id/sermon_series" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:id="@+id/sermon_pastor" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:id="@+id/sermon_date" /> 
</LinearLayout> 

Это, как вы определяете точку (или, возможно, их экземпляры)

public ViewHolder(View mView) { 
     super(view); 
     title = (TextView) holder.mView.findViewById(R.id.sermon_title); 
     series = (TextView) holder.mView.findViewById(R.id.sermon_series); 
     pastor = (TextView) holder.mView.findViewById(R.id.sermon_pastor); 
     sermonDate = (TextView) holder.mView.findViewById(R.id.sermon_date) 
     lnrLayout = (LinearLayout)holder.mView.findViewById(R.id.lnrLayout); 
    } 

Это ваш собственный viewholder, поэтому объявить TextViews только путь мы объявляем переменные .. ваш onBindView метод Виль поэтому выглядеть это сейчас:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.title.setText(mDataset.get(position).getName()); 
    holder.series.setText(mDataset.get(position).getSeries()); 
    holder.pastor.setText(mDataset.get(position).getPastor()); 
    holder.sermonDate.setText(mDataset.get(position).getSermonDate()); 
    holder.lnrLayout.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
      // on click action here 
      //-- use context to start the new Activity 
      Intent mediaStreamIntent = new Intent(mContext, MediaStreamPlayer.class); 
      mediaStreamIntent.putExtra("sermon_details", (android.os.Parcelable) mDataset.get(position)); 
      mContext.startActivity(mediaStreamIntent); 
      } 
    }); 
} 

Я действительно понятия не имею, почему существует разница между ними, может быть его потому вы intializing представления внутри onbind вместо конструктора viewholder.

Вы также можете обратиться к this

EDIT 2: (второй метод)

Изменение вы адаптера к следующему:

// Provide a suitable constructor (depends on the kind of dataset) 
public SermonListAdapter(ArrayList<Sermon> myDataset, Fragment fragment) { 
    mDataset = myDataset; 
    mFragment = fragment; 
} 

В OnClick сделать это:

if(mFragment != null && mFragment instanceof SermonFragment) { 
     ((SermonFragment)mFragment).sendToNextActivity(position); -> you can pass any data you wsh to 
} 

В раз gment класс создает открытый метод с именем sendToNextAcitivity с тем же самым параметром, а затем вызывает следующее намерение.

третий метод

Создайте интерфейс в адаптере, создать метод набора для интерфейса, реализуют интерфейс во фрагменте, а затем инициализировать его, а затем передать его к заданному методу адаптера.

затем использовать это:

if(mListener!= null) { 
     mListener.sendToNextActivity(position); -> you can pass any data you wsh to 
    } 
+0

Несколько вопрос здесь: есть ли разница между осуществить щелчок в onBindViewHolder против общественного класса ViewHolder расширяет RecyclerView.ViewHolder? как вы можете видеть сейчас, у меня есть это в классе ViewHolder, и когда я пытался создать намерение, он дал синтаксическую ошибку. также как вы определяете id для представления? действительно начинающий здесь, нужно пошаговое руководство. Спасибо – Harts

+0

@Harts - также ссылайтесь на ссылку, если она помогает –

+1

, так что у меня это получилось, lnrLayoutCardView.setOnClickListener (new View.OnClickListener() { public недействительным OnClick (View v) {// на клик действии здесь Log.d ("SermonsListAdapter.java.debug", "Test"); Намерение mediaStreamIntent = новый Intent (getActivity(), MediaStreamPlayer.class); mediaStreamIntent .putExtra ("sermon_details", (android.os.Parcelable) mDataset.get (позиция)); startActivity (mediaStreamIntent); } }); Я не могу использовать getactivity и начать деятельность, он сказал, что не может решить метод – Harts