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