Как я могу вставить элемент в Recycler View? - PullRequest
0 голосов
/ 17 февраля 2020

У меня проблема с RecyclerView. Каждый раз, когда я пытаюсь управлять Re c View для вставки, удаления или обновления какого-либо элемента, мне приходится бороться с Recycler View и злым notifyDataSetChange.

Я пробовал с runOnUiThread, и каждый раз это решение бесполезно. Я пытался вызвать notifyDataSetChange в адаптере или в Activity, который создает экземпляр Re c View.

Мне действительно нужно знать, как заставить эту работу каждый раз быть немного лучшим разработчиком. Я действительно надеюсь решить эту проблему определенно.

Это моя новая попытка


public class MainActivity extends AppCompatActivity {


    private Button nextTurn;
    private Button submit;
    private EditText name;
    private EditText number;

    private CounterElementAdapter mAdapter;
    private RecyclerView recV;
    private List<CounterElement> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nextTurn = (Button) findViewById(R.id.button2);
        submit = (Button) findViewById(R.id.button);
        name = (EditText) findViewById(R.id.editText);
        number = (EditText) findViewById(R.id.editText2);
        recV = (RecyclerView) findViewById(R.id.recV);

        list = new ArrayList<CounterElement>();

        mAdapter = new CounterElementAdapter(list);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recV.setLayoutManager(mLayoutManager);
        recV.setItemAnimator(new DefaultItemAnimator());
        recV.setAdapter(mAdapter);

        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(name.getText().toString().length() > 0 && number.getText().toString().length() > 0) {
                    mAdapter.addElement(new CounterElement(name.getText().toString(), Integer.parseInt(number.getText().toString())));
                }
            }
        });

        nextTurn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapter.nextTurn();
            }
        });
    }
} 

public class CounterElementAdapter extends RecyclerView.Adapter<CounterElementAdapter.MyViewHolder> {

    private List<CounterElement> elementList;

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView name, counter;

        public MyViewHolder(View view) {
            super(view);
            name = view.findViewById(R.id.name);
            counter = view.findViewById(R.id.counter);
        }
    }


    public CounterElementAdapter(List<CounterElement> elementList) {
        this.elementList = elementList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.element, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        CounterElement ce = elementList.get(position);
        holder.name.setText(ce.getName());
        holder.counter.setText(ce.getDuration());
    }

    @Override
    public int getItemCount() {
        return elementList.size();
    }

    public void addElement(CounterElement ce){
        elementList.add(ce);
        notifyDataSetChanged();
    }

    public void nextTurn(){
        for(CounterElement ce : elementList){
            if(ce.getStatus() >= 1)
                ce.setStatus(ce.getStatus() - 1);
            else {
                elementList.remove(elementList.indexOf(ce));
                notifyDataSetChanged();
            }
        }
    }
}

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Ваш код выглядит нормально. Я бы порекомендовал вам взглянуть на эту статью Также попробуйте отладить ваш код и проверить, правильно ли обновляются ваши elementList.

0 голосов
/ 17 февраля 2020

Некоторое время просматривал ваш код, похоже, не нашел ничего плохого. Вы используете эмулятор android для тестирования или физическое устройство? Иногда эмуляторы имеют тенденцию глючить. Попробуйте сначала инициализировать список массивов несколькими фиктивными значениями, а затем попробуйте добавить или удалить и посмотреть, поможет ли это

...