Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在回收器视图中插入元素?_Android_Android Recyclerview_Notifydatasetchanged - Fatal编程技术网

Android 如何在回收器视图中插入元素?

Android 如何在回收器视图中插入元素?,android,android-recyclerview,notifydatasetchanged,Android,Android Recyclerview,Notifydatasetchanged,我对RecyclerView有问题。 每次我试图管理Rec视图以插入、删除或更新某些元素时,我都必须与Recycler视图和notifyDataSetChange进行斗争 我试过runOnUiThread,每次这个解决方案都是无用的。 我试图在适配器或Rec视图实例中调用notifyDataSetChange 我真的需要知道如何使这项工作每次都是一个更好的开发人员。 我真的希望能明确地解决这个问题 这是我的新尝试 public class MainActivity extends AppCom

我对RecyclerView有问题。 每次我试图管理Rec视图以插入、删除或更新某些元素时,我都必须与Recycler视图和notifyDataSetChange进行斗争

我试过runOnUiThread,每次这个解决方案都是无用的。 我试图在适配器或Rec视图实例中调用notifyDataSetChange

我真的需要知道如何使这项工作每次都是一个更好的开发人员。 我真的希望能明确地解决这个问题

这是我的新尝试


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();
            }
        });
    }
} 


提前感谢

查看了您的代码一段时间,似乎没有发现任何错误,您是使用android模拟器进行测试还是使用物理设备?有时模拟器往往是有缺陷的。
首先尝试用几个伪值初始化数组列表,然后尝试添加或删除,看看这是否有帮助,代码看起来很好。我建议你看看这个
还要试着调试代码,检查elementList是否正确更新。

我在物理设备上测试了它,我会尝试按照您的建议进行。
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();
            }
        }
    }
}