为什么我的 recyclerview onclick 方法不起作用?

Why my recyclerview on click method dont work?

我试图更改我的 RecyclerViewAdapter。我试过我可以点击任何项目并打开一个新片段,以新布局显示我的结果。 但是它不起作用我的错误代码是尝试在空对象上调用虚拟方法。 在我改变它之前它工作但没有在新布局中显示这些东西。 我必须改变什么?

我显示 recyclerview 的 HomeFragment

public class Home_Fragment extends Fragment {
private RecyclerAdapter recyclerAdapter;
private static ArrayList<Data> DATA;
MainViewModel viewModel;
RecyclerView recyclerView;
OnClickListenerEvent eventlistener;
LinearLayoutManager linearLayoutManager;
private static final String TAG = "Home_Fragment";


// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
public Home_Fragment() {

}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.d(TAG, "onCreateView: createview");
    // Inflate the layout for this fragment
    DATA= new ArrayList<Data>();
    View view = inflater.inflate(R.layout.fragment_home_, container, false);
    RecyclerView recyclerView = view.findViewById(R.id.recyclerview);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerAdapter = new RecyclerAdapter(getActivity(),DATA, eventlistener);
    recyclerView.setAdapter(recyclerAdapter);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerAdapter.notifyDataSetChanged();
    Log.d(TAG, "onCreateView: viewreturned");
    viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
    viewModel.getUserMutableLiveData().observe(this, userListUpdateObserver);
    OnClickListenerEvent eventlistener = new OnClickListenerEvent(){
        @Override
        public void respond(int position, String EventName, String Location) {
            EventHolder eventHolder=new EventHolder();
            Bundle bundle=new Bundle();
            bundle.putString("Eventname",EventName);
            bundle.putString("Eventclub",Location);
            eventHolder.setArguments(bundle);
            FragmentManager manager=getFragmentManager();
            FragmentTransaction transaction=manager.beginTransaction();
            transaction.replace(R.id.main_container,eventHolder).commit();
        }
    };

    return view;

}
Observer<ArrayList<Data>> userListUpdateObserver = new Observer<ArrayList<Data>>() {
    @Override
    public void onChanged(ArrayList<Data> DATA) {
        recyclerAdapter = new RecyclerAdapter(getActivity(), DATA, eventlistener);
        linearLayoutManager = new LinearLayoutManager(getActivity());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    }

};

@Override
public void onStart() {
    super.onStart();


}

}

回收器适配器

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {




private OnClickListenerEvent eventlistener;
private final ArrayList<Data> DATA;
private LayoutInflater inflater;
private Activity activity;
private Context context;
private static final String TAG = "Recycler";


public RecyclerAdapter(Context context, ArrayList<Data> data, OnClickListenerEvent listener) {
    DATA= data;
    eventlistener = listener;
    inflater = LayoutInflater.from(context);
}


@Override
public RecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder: create Holder");
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.event_cardview, parent, false);
    MyViewHolder holder = new MyViewHolder(v, eventlistener);
    Log.d(TAG, "onCreateViewHolder: return"+DATA.size());
    return holder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder: Create holder Items");
    //holder.mImage.setImageResource(listdata.get(position).getThubnail());
    holder.Eventname.setText(DATA.get(position).getEventName());
    holder.Eventclub.setText(DATA.get(position).getEventClub());
    holder.Eventhost.setText(DATA.get(position).getEventHost());
    holder.Genre.setText(DATA.get(position).getGENRE());
    holder.Date.setText(DATA.get(position).getDATE());
    if (13 < DATA.get(position).getADRESS().length()) {
        holder.City.setLines(2);
        holder.City.setEllipsize(TextUtils.TruncateAt.END);
        holder.City.setText(DATA.get(position).getADRESS());
    }
    else{
        holder.City.setText(DATA.get(position).getADRESS());
    }
    holder.Time.setText(DATA.get(position).getStartTIME()+"-"+DATA.get(position).getEndTIME()+" Uhr");
    if(!"".equals(DATA.get(position).getPRICE()))
        holder.Price.setText(DATA.get(position).getPRICE());
    else {
        holder.Price.setText("kostenlos");
    }

    EventHolder eventHolder=new EventHolder();
    Bundle bundle=new Bundle();
    bundle.putString("Eventname",DATA.get(position).getEventName());
    bundle.putString("Location",DATA.get(position).getEventClub());
    eventHolder.setArguments(bundle);
}


@Override
public int getItemCount() {
    return DATA.size();
}

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    private CardView cv;
    ArrayList<Data> DATA;
    OnClickListenerEvent eventlistener;
    public TextView Eventname,Eventclub,Eventhost,Genre,Date,City,Time,Price;
    public TextView ViewEventname,ViewEventclub,ViewEventhost,ViewGenre,ViewDate,ViewCityAdress,ViewTime,ViewPrice,ViewInfo,ViewArtist,ViewFloor,ViewMPeople;
    private static final String TAG = "Class";




    public MyViewHolder(View v, OnClickListenerEvent listener) {
        super(v);

        eventlistener=listener;
        Log.d(TAG, "ViewHolder: created");
        cv=(CardView)v.findViewById(R.id.eventcardview);
        Eventname=(TextView)v.findViewById(R.id.EventName);
        Eventclub=(TextView)v.findViewById(R.id.EventClub);
        Eventhost=(TextView)v.findViewById(R.id.EventHost);
        Genre=(TextView)v.findViewById(R.id.Genre);
        Date=(TextView)v.findViewById(R.id.Date);
        City=(TextView)v.findViewById(R.id.location_adress);
        Time=(TextView)v.findViewById(R.id.Time);
        Price=(TextView)v.findViewById(R.id.Price);
        cv.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {eventlistener.respond(getAbsoluteAdapterPosition(),DATA.get(getAbsoluteAdapterPosition()).getEventName(), DATA.get(getAbsoluteAdapterPosition()).getEventClub());

    }
    /*holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setOnClickListener(mCallback);
                Data data = DATA.get(position);
                mCallback.onClick(data);
            AppCompatActivity activity = (AppCompatActivity) v.getContext();
            EventHolder myFragment = new EventHolder();
            activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_container, myFragment).addToBackStack(null).commit();
            holder.ViewEventname.setText(DATA.get(position).getEventName());


        }

    }); */

}

我的片段,我尝试在点击项目时以新布局显示内容

ublic class EventHolder extends Fragment{



 TextView eventclub;
   TextView vieweventname;
   String Eventname;
   String location;

public EventHolder()
{

}


@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Eventname=getArguments().getString("Eventname");
    location=getArguments().getString("Eventclub");

}

@Override
public View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_event_holder, container, false);
    vieweventname = (TextView) view.findViewById(R.id.ViewEventName);
    eventclub = (TextView) view.findViewById(R.id.EventClub);
    vieweventname.setText(Eventname);
    eventclub.setText(location);
    return view;
}

}

我的 MainActivity,我从我的 php 服务器获得结果

public void onLocationChanged(Location location) {


            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            getAddressString(latitude, longitude);
            final String lat1 = String.valueOf(latitude);
            final String lng1 = String.valueOf(longitude);
            Log.d(TAG, "onLocationChanged: postition" + " latitude " + latitude + " longitude" + longitude);
            JsonObject object;


            class AddCoord extends AsyncTask<Void, Void, String> {
                public String res;
                
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();

                }

                @Override
                protected void onPostExecute(String res) {
                    super.onPostExecute(res);
                    RecyclerView recyclerView= findViewById(R.id.recyclerview);
                    try {
                        JSONArray responsearray =  new JSONArray(res);
                        ArrayList<Data> DATA = new ArrayList<>();
                        //Populate the EmployeeDetails list from response
                        for (int i = 0; i<responsearray.length();i++){
                            JSONObject event = responsearray.getJSONObject(i);
                            Data events = new Data();
                            events.setId(event.getInt("ID"));
                            events.setEventName(event.getString("Eventname"));
                            events.setEventClub(event.getString("Eventlocation"));
                            events.setEventHost(event.getString("Eventhost"));
                            events.setGENRE(event.getString("Genre"));
                            events.setDATE(event.getString("Date"));
                            events.setADRESS(event.getString("City"));
                            events.setStartTIME(event.getString("StartTime"));
                            events.setEndTIME(event.getString("EndTime"));
                            events.setPRICE(event.getString("Price"));
                            DATA.add(events); // <<<<<< Here is the Change

                        }
                        //Create an adapter with the EmployeeDetails List and set it to the LstView
                        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(getParent(),DATA);
                        recyclerView.setAdapter(recyclerAdapter);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    //  System.out.println(getResponse);
                }


                @Override
                protected String doInBackground(Void... v) {
                    HashMap<String, String> params = new HashMap<>();
                    params.put(Config.KEY_EMP_LAT, lat1);
                    params.put(Config.KEY_EMP_LNG, lng1);
                    RequestHandler rh = new RequestHandler();
                    String res = rh.sendPostRequest(Config.URL_ADD, params);
                    Log.d(TAG, "doInBackground: "+ params);
                    Log.d(TAG, "doInBackground: SENDED!");
                    Log.d(TAG, "doInBackground: "+ res);
                    return res;

                }


            }
            AddCoord ac = new AddCoord();
            ac.execute();






        }

请在它完美运行之前提供帮助,但在单击时没有显示新片段中的内容。 我要改变什么。

错误:

 java.lang.NullPointerException: Attempt to invoke interface method 'void de.n.newnightstar.OnClickListenerEvent.respond(int, java.lang.String, java.lang.String)' on a null object reference
    at de.n.newnightstar.RecyclerAdapter$MyViewHolder.onClick(RecyclerAdapter.java:112)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access00(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

尝试从您的 RecyclerAdapter 中删除 onClick 实现,而是像这样将 onclicklistener 放入 onBindViewHolder 中:

holder.cv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

       ...handle on click...

    }

});
public class MyViewHolder extends RecyclerView.ViewHolder{ // implements View.OnClickListener/
    private CardView cv;
    public TextView Eventname,Eventclub,Eventhost,Genre,Date,City,Time,Price;
    public TextView ViewEventname,ViewEventclub,ViewEventhost,ViewGenre,ViewDate,ViewCityAdress,ViewTime,ViewPrice,ViewInfo,ViewArtist,ViewFloor,ViewMPeople;
    private static final String TAG = "Class";



    public MyViewHolder(View v, OnClickListenerEvent listener) {
        super(v);

        eventlistener=listener;
        Log.d(TAG, "ViewHolder: created");
        cv=(CardView)v.findViewById(R.id.eventcardview);
        Eventname=(TextView)v.findViewById(R.id.EventName);
        Eventclub=(TextView)v.findViewById(R.id.EventClub);
        Eventhost=(TextView)v.findViewById(R.id.EventHost);
        Genre=(TextView)v.findViewById(R.id.Genre);
        Date=(TextView)v.findViewById(R.id.Date);
        City=(TextView)v.findViewById(R.id.location_adress);
        Time=(TextView)v.findViewById(R.id.Time);
        Price=(TextView)v.findViewById(R.id.Price);
        ViewEventname=(TextView)v.findViewById(R.id.ViewEventName);
        ViewEventclub=(TextView)v.findViewById(R.id.ViewEventClub);

    }

绑定视图:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder: Create holder Items");
    //holder.mImage.setImageResource(listdata.get(position).getThubnail());
    holder.Eventname.setText(DATA.get(position).getEventName());
    holder.Eventclub.setText(DATA.get(position).getEventClub());
    holder.Eventhost.setText(DATA.get(position).getEventHost());
    holder.Genre.setText(DATA.get(position).getGENRE());
    holder.Date.setText(DATA.get(position).getDATE());
    if (13 < DATA.get(position).getADRESS().length()) {
        holder.City.setLines(2);
        holder.City.setEllipsize(TextUtils.TruncateAt.END);
        holder.City.setText(DATA.get(position).getADRESS());
    }
    else{
        holder.City.setText(DATA.get(position).getADRESS());
    }
    holder.Time.setText(DATA.get(position).getStartTIME()+"-"+DATA.get(position).getEndTIME()+" Uhr");
    if(!"".equals(DATA.get(position).getPRICE()))
        holder.Price.setText(DATA.get(position).getPRICE());
    else {
        holder.Price.setText("kostenlos");
    }
    holder.cv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            eventlistener.respond(position,
                    DATA.get(position).getEventName(),
                    DATA.get(position).getEventClub());
        }
    });

    EventHolder eventHolder=new EventHolder();
    Bundle bundle=new Bundle();
    bundle.putString("Eventname",DATA.get(position).getEventName());
    bundle.putString("Eventclub",DATA.get(position).getEventClub());
    eventHolder.setArguments(bundle);


}

我的错误:

ava.lang.NullPointerException: Attempt to invoke interface method 'void de.n.newnightstar.OnClickListenerEvent.respond(int, java.lang.String, java.lang.String)' on a null object reference
    at de.n.newnightstar.RecyclerAdapter.onClick(RecyclerAdapter.java:75)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access00(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我通过将 OnClickListenerEvent 也添加到我从服务器获取数据的主要活动中解决了我的问题。现在一切正常谢谢大家帮助我!