Android 为什么我的recyclerview on click方法不起作用?

Android 为什么我的recyclerview on click方法不起作用?,android,android-recyclerview,onclick,Android,Android Recyclerview,Onclick,我试着更换我的回收设备适配器。我试着点击任何项目,打开一个新的片段,在新的布局中显示我的结果。 但它不起作用。我的错误代码是试图在空对象上调用虚方法。 在我更改它之前,它工作正常,但没有在新的布局中显示这些内容。 我必须改变什么 显示recyclerview的HomeFragment public class Home_Fragment extends Fragment { private RecyclerAdapter recyclerAdapter; private static Array

我试着更换我的回收设备适配器。我试着点击任何项目,打开一个新的片段,在新的布局中显示我的结果。 但它不起作用。我的错误代码是试图在空对象上调用虚方法。 在我更改它之前,它工作正常,但没有在新的布局中显示这些内容。 我必须改变什么

显示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();


}
}

从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();






        }

尝试从
RecyclerAdapter
中删除
onClick
实现,并将onclicklistener放入
onBindViewHolder
中,如下所示:

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

       ...handle on click...

    }

});
onbindview:

@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);


}

通过将OnClickListenerEvent也添加到从服务器获取数据的主活动中,我解决了问题。现在一切都很好谢谢你们的帮助

请添加您收到的错误,与控制台日志中所写的完全相同。我编辑了代码并添加了错误。我昨天改变了一些东西,现在是一个新的错误。希望有人能帮助我不知道如何解决它尝试了一切。我尝试了它,但也没有工作,它给了我同样的错误。这个错误是在它启动后出现的,它向我显示了RecycleVerw中的所有元素,但当我按下cardview时,它崩溃了,并给出了错误。我几乎尝试了所有的方法,在recyclerview中必须有一个简单的方法来实现一个常见的onClick方法,但到目前为止没有任何效果。你是否从
myViewHolder
类中删除了所有的onClick实现?这意味着您重写的OnClick方法和
cv.setOnClickListener(this)当然,现在错误出现在我的onbindview中的那一行查看我的答案我添加到我的问题中有新的代码。谢谢你的帮助我不知道是什么问题我只需要在recyclerview中使用click方法。我设置了if station来找出问题所在eventlistener似乎为null,不知道为什么我现在尝试找出它。问题是你没有在片段中正确初始化listener。在将其传递给适配器之前,您应该初始化
eventlistener
。一切都正常,但当我尝试单击汽车视图并进入新布局时,它将显示所有数据,并崩溃。
 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.access$3100(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)
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$1.onClick(RecyclerAdapter.java:75)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(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)