从适配器 class 填充 Activity 的 TextView 时出现问题
Problem with filling Activity's TextView from the Adapter class
我有一个适配器可以填充我的 RecyclerView。
由于 onClick,当我点击 RecyclerView 的项目时,我存储了与查询匹配的数据库数据并开始新的 Activity。例如,我想用名为 "name" 的列中的数据填充一个 Activity 的 TextView。但是,当我单击 RecyclerView 的项目时,应用程序崩溃了。我怎么解决这个问题? (如果您需要,我可以提供更多代码或信息。)
MyAdapter.java代码:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener {
private ArrayList<MyObject> mItems = new ArrayList<>();
public String nametext;
DatabaseHelper myDB;
Main3Activity my3;
int idactivity;
String nameactivity;
int yearactivity;
int monthactivity;
int dayactivity;**
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
MyViewHolder vh=new MyViewHolder(view);
view.setOnClickListener(this);
return vh;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.bindData(getItem(position));
}
@Override
public int getItemCount() {
return mItems.size();
}
public void updateData(ArrayList<MyObject> items) {
mItems = new ArrayList<>(items);
notifyDataSetChanged();
}
private MyObject getItem(int position) {
if (position >= 0 && position < mItems.size())
return mItems.get(position);
return null;
}
@Override
public void onClick(View v) {
idactivity = 0;
nameactivity = null;
yearactivity = 0;
monthactivity = 0;
dayactivity = 0;
myDB = new DatabaseHelper(v.getContext());
my3 = new Main3Activity();
TextView clickedName=(TextView)v.findViewById(R.id.title);
nametext = clickedName.getText().toString();
Toast.makeText(v.getContext(),nametext,Toast.LENGTH_LONG).show();
Cursor c = myDB.showDataonSelect(nametext);
if(c.moveToFirst()) {
idactivity = c.getInt(0) ;
nameactivity = c.getString(1) ;
yearactivity = c.getInt(2) ;
monthactivity = c.getInt(3) ;
dayactivity = c.getInt(4);
}
TextView txt1 = my3.getTxt1();
txt1.setText(nameactivity);
Intent myIntent = new Intent(v.getContext(), Main3Activity.class);
v.getContext().startActivity(myIntent);
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView subTitle;
MyViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
subTitle = itemView.findViewById(R.id.sub_title);
}
void bindData(MyObject myObject) {
if (myObject == null)
return;
title.setText(myObject.title);
subTitle.setText(myObject.subTitle);
}
} }
Main3Activity.java代码:
public class Main3Activity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
public TextView getTxt1(){
TextView txt1 = findViewById(R.id.textView3);
return txt1;
}}
logcat 崩溃时出现异常消息:
2019-06-06 18:12:27.721 15509-15509/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 15509
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
at com.example.myapplication.Main3Activity.getTxt1(Main3Activity.java:18)
at com.example.myapplication.MyAdapter.onClick(MyAdapter.java:90)
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)
我想从 MyAdapter 的 onClick 方法填充 Activity 的 TextView。
从 onClick 中移除 TextView TextView clickedName=(TextView)v.findViewById(R.id.title);
的初始化并在您的 Holder class 中初始化它。
您似乎想在用户单击项目时使用项目标题打开 Main3Activity。这样做的方法是将一个额外的参数传递给 activity(也称为片段参数)
首先你应该在 MyViewHolder 中实现 View.OnClickListener:
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
也将其从 MyAdapter 中删除:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
然后将您的 onClick 方法从 MyAdapter 移到 MyViewHolder 中
同样在 onClick 方法中,不要使用 Main3Activity 构造函数。只需使用 Intent 并在标题中添加一个额外内容。
@Override
public void onClick(View v) {
Intent myIntent = new Intent(v.getContext(), Main3Activity.class);
myIntent.putExtra("TITLE_EXTRA", title.getText().toString())
v.getContext().startActivity(myIntent);
}
将 onClick 方法中的任何其他内容移至 Main3Activity 的 onCreate 或任何其他方法。
要在 Main3Activity 中获取 TITLE_EXTRA,请将此添加到您的 onCreate 方法中:
private String title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity);
...
if(getIntent() != null) {
title = getIntent().getStringExtra("TITLE_EXTRA")
}
...
}
我有一个适配器可以填充我的 RecyclerView。 由于 onClick,当我点击 RecyclerView 的项目时,我存储了与查询匹配的数据库数据并开始新的 Activity。例如,我想用名为 "name" 的列中的数据填充一个 Activity 的 TextView。但是,当我单击 RecyclerView 的项目时,应用程序崩溃了。我怎么解决这个问题? (如果您需要,我可以提供更多代码或信息。)
MyAdapter.java代码:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener {
private ArrayList<MyObject> mItems = new ArrayList<>();
public String nametext;
DatabaseHelper myDB;
Main3Activity my3;
int idactivity;
String nameactivity;
int yearactivity;
int monthactivity;
int dayactivity;**
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
MyViewHolder vh=new MyViewHolder(view);
view.setOnClickListener(this);
return vh;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.bindData(getItem(position));
}
@Override
public int getItemCount() {
return mItems.size();
}
public void updateData(ArrayList<MyObject> items) {
mItems = new ArrayList<>(items);
notifyDataSetChanged();
}
private MyObject getItem(int position) {
if (position >= 0 && position < mItems.size())
return mItems.get(position);
return null;
}
@Override
public void onClick(View v) {
idactivity = 0;
nameactivity = null;
yearactivity = 0;
monthactivity = 0;
dayactivity = 0;
myDB = new DatabaseHelper(v.getContext());
my3 = new Main3Activity();
TextView clickedName=(TextView)v.findViewById(R.id.title);
nametext = clickedName.getText().toString();
Toast.makeText(v.getContext(),nametext,Toast.LENGTH_LONG).show();
Cursor c = myDB.showDataonSelect(nametext);
if(c.moveToFirst()) {
idactivity = c.getInt(0) ;
nameactivity = c.getString(1) ;
yearactivity = c.getInt(2) ;
monthactivity = c.getInt(3) ;
dayactivity = c.getInt(4);
}
TextView txt1 = my3.getTxt1();
txt1.setText(nameactivity);
Intent myIntent = new Intent(v.getContext(), Main3Activity.class);
v.getContext().startActivity(myIntent);
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView subTitle;
MyViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
subTitle = itemView.findViewById(R.id.sub_title);
}
void bindData(MyObject myObject) {
if (myObject == null)
return;
title.setText(myObject.title);
subTitle.setText(myObject.subTitle);
}
} }
Main3Activity.java代码:
public class Main3Activity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
public TextView getTxt1(){
TextView txt1 = findViewById(R.id.textView3);
return txt1;
}}
logcat 崩溃时出现异常消息:
2019-06-06 18:12:27.721 15509-15509/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 15509
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
at com.example.myapplication.Main3Activity.getTxt1(Main3Activity.java:18)
at com.example.myapplication.MyAdapter.onClick(MyAdapter.java:90)
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)
我想从 MyAdapter 的 onClick 方法填充 Activity 的 TextView。
从 onClick 中移除 TextView TextView clickedName=(TextView)v.findViewById(R.id.title);
的初始化并在您的 Holder class 中初始化它。
您似乎想在用户单击项目时使用项目标题打开 Main3Activity。这样做的方法是将一个额外的参数传递给 activity(也称为片段参数)
首先你应该在 MyViewHolder 中实现 View.OnClickListener:
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
也将其从 MyAdapter 中删除:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
然后将您的 onClick 方法从 MyAdapter 移到 MyViewHolder 中
同样在 onClick 方法中,不要使用 Main3Activity 构造函数。只需使用 Intent 并在标题中添加一个额外内容。
@Override
public void onClick(View v) {
Intent myIntent = new Intent(v.getContext(), Main3Activity.class);
myIntent.putExtra("TITLE_EXTRA", title.getText().toString())
v.getContext().startActivity(myIntent);
}
将 onClick 方法中的任何其他内容移至 Main3Activity 的 onCreate 或任何其他方法。
要在 Main3Activity 中获取 TITLE_EXTRA,请将此添加到您的 onCreate 方法中:
private String title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity);
...
if(getIntent() != null) {
title = getIntent().getStringExtra("TITLE_EXTRA")
}
...
}