2017-02-18 4 views
0

Я новичок в программировании для 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); 
    } 
}} 

ответ

0

Вы должны использовать title2.set(0, " OS");, когда вы хотите заменить деталь. Добавить будет добавлять элемент каждый раз в списке. Набор используется для замены элементов в списке.

+0

Спасибо! само собой разумеется, что это работает. я проверяю с bool, если это первый раз, когда нажимают на Fab. если true, я использую .add. В противном случае я использую .set Единственная проблема теперь в том, что если другая карта будет удалена после того, как Fab уже был нажат, щелчок по ней снова приведет к сбою приложения. Знаете ли вы, как я мог это исправить? спасибо – oxcened

+0

ОК неважно, я исправил это. в случае, если кому-то это нужно: в методе onSwiped я добавил title2.clear(), и я снова установил для переменной bool first_time значение true, чтобы arraylist получил сброс, и программа снова использует .add. в основном диалоговое окно предупреждения снова загружается с нуля. – oxcened

Смежные вопросы