Я новичок в программировании для Android, и мне бы хотелось, чтобы мне помогли в проблеме, с которой я сейчас сталкиваюсь: в основном у меня есть вид ресайклера, содержащий 4 карты, которые можно удалить путем прокрутки.FAB, чтобы открыть диалоговое окно для повторного добавления любой карты, в конечном итоге удаленной в recyclerview
У меня также есть плавающая кнопка действия, целью которой является повторное добавление карт, которые в конечном итоге были удалены.
Он показывает диалоговое окно предупреждения, в котором перечислены элементы массива, которые относятся к удаленным картам.
Кнопка работает совершенно нормально при первом нажатии.
Screenshot. Здесь я удалил карты Monitor и Keyboard, и на самом деле они отображали в диалоговом окне предупреждения эти два элемента.
Однако проблемы возникают в следующих щелчках.
Screenshot_2. Элементы просто добавляются в список диалогов (даже если, насколько я знаю, выполнение команды arraylist.add, дающей тот же индекс, всегда должен перезаписывать элемент).
Я был бы очень признателен, если бы кто-нибудь мог дать мне решение этой проблемы.
Или даже совершенно новый способ сделать это, если моя не может быть исправлена вообще.
Скажите, пожалуйста, если вам нужно что-нибудь еще знать.
В принципе, мне просто нужен способ повторного добавления карты recyclerview, которая в конечном итоге была удалена. СПАСИБО.
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
ArrayList<String> title = new ArrayList<>();
private String[] button = {"choose os", "choose resolution", "choose type", "choose type"};
int initialSizeRows;
RelativeLayout relativeLayout;
private ArrayList<String> title2 = new ArrayList<>();
boolean os=false, monitor=false, keyboard=false, mouse=false, first_time=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
adapter = new RecyclerAdapter(title,button);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
title.addAll(Arrays.asList("OS", "Monitor", "Keyboard", "Mouse"));
relativeLayout = (RelativeLayout) findViewById(R.id.relative_layout);
//adapter for arraylist item2 to be set in the alert dialog
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, title2);
//fab
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
//fab onclicklistener
public void onClick(View view) {
if (title.size() == 4) {
//if no card has been deleted
Snackbar.make(relativeLayout, "Nothing to add!", Snackbar.LENGTH_SHORT).show();
} else {
//check which card/s have been deleted and add them to the arraylist "title2"
//the if(s) purposes is to always add the values in the correct indexes
if (!title.contains("OS")) {
title2.add(0, " OS");
os = true;
}
if (!title.contains("Monitor")) {
if (os) title2.add(1, " Monitor");
else title2.add(0, " Monitor");
monitor = true;
}
if (!title.contains("Keyboard")) {
if (os && monitor) title2.add(2, " Keyboard");
else if (!os && !monitor) title2.add(0, " Keyboard");
else if (!os^!monitor) title2.add(1, " Keyboard");
keyboard = true;
}
if (!title.contains("Mouse")) {
if (os && monitor && keyboard) title2.add(3, " Mouse");
else if (!os && !monitor && !keyboard) title2.add(0, " Mouse");
else if (!os && (monitor^keyboard)) title2.add(1, " Mouse");
else if (!os && (monitor && keyboard)) title2.add(2, " Mouse");
else if (os && (!monitor && !keyboard)) title2.add(1, " Mouse");
else if (os && (monitor^keyboard)) title2.add(2, " Mouse");
}
//create alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
//set adapter with arraylist just populated above
builder.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//to be done
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
});
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
title.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}}
RecyclerAdapter.java
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder>{
ArrayList<String> title;
String[] button;
public RecyclerAdapter(ArrayList<String> title, String[] button){
this.title = title;
this.button = button;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view,parent,false);
RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view);
return recyclerViewHolder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
holder.titleTextView.setText(title.get(position));
holder.buttonTextView.setText(button[position]);
}
@Override
public int getItemCount() {
return title.size();
}
public static class RecyclerViewHolder extends RecyclerView.ViewHolder{
TextView titleTextView, buttonTextView;
public RecyclerViewHolder(View itemView) {
super(itemView);
titleTextView = (TextView) itemView.findViewById(R.id.title);
buttonTextView = (TextView) itemView.findViewById(R.id.button);
}
}}
Спасибо! само собой разумеется, что это работает. я проверяю с bool, если это первый раз, когда нажимают на Fab. если true, я использую .add. В противном случае я использую .set Единственная проблема теперь в том, что если другая карта будет удалена после того, как Fab уже был нажат, щелчок по ней снова приведет к сбою приложения. Знаете ли вы, как я мог это исправить? спасибо – oxcened
ОК неважно, я исправил это. в случае, если кому-то это нужно: в методе onSwiped я добавил title2.clear(), и я снова установил для переменной bool first_time значение true, чтобы arraylist получил сброс, и программа снова использует .add. в основном диалоговое окно предупреждения снова загружается с нуля. – oxcened