2017-05-24 2 views
0

geklickt zu werden Ich habe eine recyclerView in einem Fragment erstellt, ich implementiere auch den onItemClickListener im Adapter. jetzt muss ich dem Klick die Aktion in der RecyclerView im Fragment geben, aber ich kann es nicht tun. Hoffe, du kannst mir helfen, es herauszufinden. Ich schätze es.Der Versuch, auf eine RecyclerView in Fragment

Erstens ist dies der Adapter:

// inner class to hold a reference to each item of RecyclerView 
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 

    public TextView textName; 
    public TextView textAddress; 
    public ImageView imageView; 
    private Place place; 



    public ViewHolder(View itemLayoutView) { 
     super(itemLayoutView); 
     textName = (TextView) itemLayoutView.findViewById(R.id.placeName); 
     textAddress = (TextView) itemLayoutView.findViewById(R.id.placeAddress); 
     imageView = (ImageView) itemLayoutView.findViewById(R.id.imagePlace); 

    } 

    public void bind(Place place) { 
     this.place = place; 
     textName.setText(place.getName()); 
     textAddress.setText(place.getAdress()); 

    } 

    @Override 
    public void onClick(View v) { 
     clickListener.onItemClick(getAdapterPosition(), v); 
    } 

    @Override 
    public boolean onLongClick(View v) { 
     clickListener.onItemLongClick(getAdapterPosition(), v); 
     return false; 
    } 



    public void setOnItemClickListener(ClickListener clickListener) { 
     PlaceAdapter.clickListener = clickListener; 
    } 

    public interface ClickListener { 
     void onItemClick(int position, View v); 
     void onItemLongClick(int position, View v); 
     Place sendToMap(); 
    } 
} 

dann habe ich das Fragment:

public class FragmentNearMe extends Fragment 
     implements View.OnClickListener { 

    public static final String ARG_PAGE = "ARG_PAGE"; 
    public static final String SEARCH_RESULT_ACTION="SEARCH_RESULT_ACTION"; 
    private int aroundMe; 
    private PlaceAdapter adapter; 
    private LocationManager locationManager; 
    private SearchBrodcastReciver searchBrodcastReciver; 
    private EditText searchFild; 
    private LatLng latLng; 
    private ImageView iconPlace; 
    private Context context; 

    public void setLatLng(LatLng latLng) { 
     if (this.latLng == null) { 
      getView().findViewById(R.id.location_warning).setVisibility(View.GONE); 
      searchFild.setVisibility(View.VISIBLE); 
     } 
     this.latLng = latLng; 
    } 

    public static FragmentNearMe newInstance(int around) { 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, around); 
     FragmentNearMe fragment = new FragmentNearMe(); 
     fragment.setArguments(args); 
     return fragment; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     aroundMe = getArguments().getInt(ARG_PAGE); 
     searchBrodcastReciver=new SearchBrodcastReciver(); 

    } 

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

     return view; 
    } 

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

     RecyclerView listPlaces = (RecyclerView) view.findViewById(R.id.placesList); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
     adapter = new PlaceAdapter(new ArrayList<Place>()); 
     listPlaces.setLayoutManager(layoutManager); 
     listPlaces.setAdapter(adapter); 

     searchFild= (EditText) view.findViewById(R.id.textSearch); 
     ImageButton imageButton= (ImageButton) view.findViewById(R.id.searchbtn); 
     imageButton.setOnClickListener(this); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(searchBrodcastReciver, new IntentFilter(SEARCH_RESULT_ACTION)); 
    } 

    @Override 
    public void onPause() { 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(searchBrodcastReciver); 
     super.onPause(); 
    } 


    @Override 
    public void onClick(View v) { 
     String placeName= searchFild.getText().toString(); 
     if(placeName != null) { 
      Intent intent = new Intent(getActivity(), MyIntentService.class); 
      intent.putExtra(MyIntentService.KEY_PLACE, placeName); 
      intent.putExtra(MyIntentService.KEY_RADIUS, 5); 
      intent.putExtra(MyIntentService.KEY_LOCATION, latLng); 
      getActivity().startService(intent); 
     }else { 
      Toast.makeText(getContext() , "place not exsist" , Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public class SearchBrodcastReciver extends BroadcastReceiver{ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(SEARCH_RESULT_ACTION)){ 
       PlaceLogic placeLogic= new PlaceLogic(getActivity()); 
       adapter.setPlaces(placeLogic.getAllPlaces()); 
      } 

     } 
    } 
} 
+0

Was meinst du mit * aber ich kann es nicht * tun? Was ist dein Problem? – Selvin

+0

Ich meinte, ich muss auf ein Element in der RecyclerView klicken, also muss ich den Klick in das Fragment implementieren. und ich weiß nicht, wie es geht. –

+0

folgen Sie meiner Antwort wird es funktionieren – MageNative

Antwort

0

hinzufügen Onclick auf dem Layout itemLayoutView es funktionieren wird.

1

Kopie dieses in dir Adapter

public interface OnClickListner { void setOnItemClick(int postion, View view); }

dann eine Instanz erstellen OnClickListner onClickListner ;

dann erstellen Sie einen Setter public void setOnClickListner(OnClickListner onClickListner) { this.onClickListner = onClickListner ; }

jetzt in OnBind

holder.myview.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickListner .setOnItemClick(position,view); 
     } 
    }); 

i dann n Ihr Fragment fügen diese

adapter.setOnClickListner(this); 

dann Methode implementieren und ausführen Aktion

+0

Dies ist sehr richtig Ansatz zum Erstellen benutzerdefinierter Listener @liad iluz gehen voran mit obigen Beispiel. –

+0

Großartig! es funktioniert. –

+0

akzeptieren Sie die Antwort, indem Sie auf die Schaltfläche "Prüfen" klicken. also könnte es für andere hilfreich sein @liadiluz – xbadal

0

Dies ist der Klick-Listener ist

public static interface ClickListener { 
    public void onClick(View view, int position); 

    public void onLongClick(View view, int position); 
} 

public static class RecyclerItemListner implements RecyclerView.OnItemTouchListener { 

    private GestureDetector gestureDetector; 
    private AtInfamaCenter.ClickListener clickListener; 

    public RecyclerItemListner(Context context, final RecyclerView recyclerView, final AtInfamaCenter.ClickListener clickListener) { 
     this.clickListener = clickListener; 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 

       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if (child != null && clickListener != null) { 
        clickListener.onLongClick(child, recyclerView.getChildPosition(child)); 
       } 
      } 
     }); 
    } 

es dann auf diese Weise verwenden, in der onActivityCreated Methode

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
     layoutManager.setReverseLayout(true); 
     layoutManager.setStackFromEnd(true); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL)); 
recyclerView.addOnItemTouchListener(new MyActivity.RecyclerItemListner(getActivity(), recyclerView, new MyActivity.ClickListener() { 
      @Override 
      public void onClick(View view, int position) { 

      //Code when item is clicked 
      } 

      @Override 
      public void onLongClick(View view, final int position) { 

// code when item is long clicked 

      } 
     })); 

Ich hoffe, das hilft. Happy coding

Verwandte Themen