RecyclerView Adapter returns null,尝试删除项目时
RecyclerView Adapter returns null, when trying to remove items
我偶然发现了我的 RecyclerView
的问题。我现在正在尝试这样做,以便我的上下文菜单(出现在长按时)可以删除我的回收站视图中的项目,但没有运气。
我已经调试了我的应用程序,每次我点击应该删除该项目的按钮时,我的应用程序崩溃,我得到的信息是我的适配器 returns null
.
我的主要活动:
public class MainActivity extends AppCompatActivity {
//Til LongClickListener
CalculationsAdapter adapter;
ArrayList<Calculation> calculations = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
RecyclerView rvCalculations = (RecyclerView) findViewById(R.id.rvCalculations);
RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL);
rvCalculations.addItemDecoration(itemDecoration);
//Til CostumItemDecoration
//RecyclerView.ItemDecoration CostumItemDecoration = new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL);
//rvCalculations.addItemDecoration(CostumItemDecoration);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()){
case R.id.add_new_calculation:
/* for at starte newcalculation activiteten, gør det i gråt.
Intent intent = new Intent(MainActivity.this, newcalculation.class);
startActivity(intent);
*/
final AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
final View mView = getLayoutInflater().inflate(R.layout.dialog_namecalculation, null);
final EditText mNameEditText = (EditText) mView.findViewById(R.id.editText_calculationName);
Button mNameButton = (Button) mView.findViewById(R.id.button_nameCalculation);
//Viser Alertdialogen
mBuilder.setView(mView);
final AlertDialog dialog = mBuilder.create();
dialog.show();
mNameButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Her skal der være noget der gør at jeg ikke kan give to af samme navn
//if (mNameEditText.getText() == .getName) ){
//}
if (mNameEditText.getText().toString().isEmpty()) {
Toast.makeText(MainActivity.this, R.string.ErrorMessageNameCalculation,Toast.LENGTH_SHORT).show();
}else{
RecyclerView rvCalculations = (RecyclerView) findViewById(R.id.rvCalculations);
//calculations = Calculation.createCalculationsList(50);
calculations.add(0, new Calculation(" " + mNameEditText.getText()));
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
rvCalculations.setAdapter(adapter);
rvCalculations.setLayoutManager(new LinearLayoutManager(MainActivity.this));
adapter.notifyItemInserted(0);
rvCalculations.scrollToPosition(0);
Toast.makeText(MainActivity.this, R.string.SuccesMessageNameCalculation,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
}
return super.onOptionsItemSelected(item);
}
//Til LongClickListener
@Override
public boolean onContextItemSelected(MenuItem item) {
//Hvad itemet i LongClicket skal gøre
switch (item.getItemId()){
case 1:
adapter.removeItem(item.getGroupId());
Toast.makeText(MainActivity.this, "Regningen blev slettet", Toast.LENGTH_SHORT).show();
return true;
case 2:
Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
}
LogCat:
08-03 23:33:44.443 1481-1481/hndvrkerregner.hndvrkerregner E/AndroidRuntime: FATAL EXCEPTION: main
Process: package, PID: 1481
java.lang.NullPointerException: Attempt to invoke virtual method 'void package.CalculationsAdapter.removeItem(int)' on a null object reference
at package.MainActivity.onContextItemSelected(MainActivity.java:128)
您已在 Activity
class "MainActivity" 的顶部声明了 class 变量 CalculationsAdapter adapter;
。但是在 onOptionsItemSelected()
方法中,您将在这行代码中覆盖此声明:
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
这一行应该是:
adapter = new CalculationsAdapter(calculations);
解释:
通过这样做:
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
您正在将 adapter
变成一个局部变量——仅对方法 onOptionsItemSelected()
是局部的,因此 adapter
在 onContextItemSelected()
中是 null
.
为了将 adapter
保持为有效的 class 变量,请改用这行代码:
我偶然发现了我的 RecyclerView
的问题。我现在正在尝试这样做,以便我的上下文菜单(出现在长按时)可以删除我的回收站视图中的项目,但没有运气。
我已经调试了我的应用程序,每次我点击应该删除该项目的按钮时,我的应用程序崩溃,我得到的信息是我的适配器 returns null
.
我的主要活动:
public class MainActivity extends AppCompatActivity {
//Til LongClickListener
CalculationsAdapter adapter;
ArrayList<Calculation> calculations = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
RecyclerView rvCalculations = (RecyclerView) findViewById(R.id.rvCalculations);
RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL);
rvCalculations.addItemDecoration(itemDecoration);
//Til CostumItemDecoration
//RecyclerView.ItemDecoration CostumItemDecoration = new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL);
//rvCalculations.addItemDecoration(CostumItemDecoration);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()){
case R.id.add_new_calculation:
/* for at starte newcalculation activiteten, gør det i gråt.
Intent intent = new Intent(MainActivity.this, newcalculation.class);
startActivity(intent);
*/
final AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
final View mView = getLayoutInflater().inflate(R.layout.dialog_namecalculation, null);
final EditText mNameEditText = (EditText) mView.findViewById(R.id.editText_calculationName);
Button mNameButton = (Button) mView.findViewById(R.id.button_nameCalculation);
//Viser Alertdialogen
mBuilder.setView(mView);
final AlertDialog dialog = mBuilder.create();
dialog.show();
mNameButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Her skal der være noget der gør at jeg ikke kan give to af samme navn
//if (mNameEditText.getText() == .getName) ){
//}
if (mNameEditText.getText().toString().isEmpty()) {
Toast.makeText(MainActivity.this, R.string.ErrorMessageNameCalculation,Toast.LENGTH_SHORT).show();
}else{
RecyclerView rvCalculations = (RecyclerView) findViewById(R.id.rvCalculations);
//calculations = Calculation.createCalculationsList(50);
calculations.add(0, new Calculation(" " + mNameEditText.getText()));
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
rvCalculations.setAdapter(adapter);
rvCalculations.setLayoutManager(new LinearLayoutManager(MainActivity.this));
adapter.notifyItemInserted(0);
rvCalculations.scrollToPosition(0);
Toast.makeText(MainActivity.this, R.string.SuccesMessageNameCalculation,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
}
return super.onOptionsItemSelected(item);
}
//Til LongClickListener
@Override
public boolean onContextItemSelected(MenuItem item) {
//Hvad itemet i LongClicket skal gøre
switch (item.getItemId()){
case 1:
adapter.removeItem(item.getGroupId());
Toast.makeText(MainActivity.this, "Regningen blev slettet", Toast.LENGTH_SHORT).show();
return true;
case 2:
Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
}
LogCat:
08-03 23:33:44.443 1481-1481/hndvrkerregner.hndvrkerregner E/AndroidRuntime: FATAL EXCEPTION: main
Process: package, PID: 1481
java.lang.NullPointerException: Attempt to invoke virtual method 'void package.CalculationsAdapter.removeItem(int)' on a null object reference
at package.MainActivity.onContextItemSelected(MainActivity.java:128)
您已在 Activity
class "MainActivity" 的顶部声明了 class 变量 CalculationsAdapter adapter;
。但是在 onOptionsItemSelected()
方法中,您将在这行代码中覆盖此声明:
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
这一行应该是:
adapter = new CalculationsAdapter(calculations);
解释:
通过这样做:
CalculationsAdapter adapter = new CalculationsAdapter(calculations);
您正在将 adapter
变成一个局部变量——仅对方法 onOptionsItemSelected()
是局部的,因此 adapter
在 onContextItemSelected()
中是 null
.
为了将 adapter
保持为有效的 class 变量,请改用这行代码: