简体   繁体   English

如何使用AlertDialog在RecyclerView中添加项目?

[英]How to use an AlertDialog to add an item in a RecyclerView?

I'm building a list using a RecyclerView. 我正在使用RecyclerView构建列表。 When the user clicks the '+' button in the toolbar an AlertDialog is launched that prompts the users to add an item in the list. 当用户单击工具栏上的“ +”按钮时,将启动AlertDialog,提示用户在列表中添加项目。 I've built the AlertDialog in a separate class that extends DialogFragment. 我在扩展DialogFragment的单独类中构建了AlertDialog。 How can I make so that the item is added to the List<Task> ? 如何使该项目添加到List<Task>

What I've done so far in my adapter class is make List<Task> mTaskList a public static variable and I also created a static method that will return this list. 到目前为止,我在适配器类中所做的是将List<Task> mTaskList为公共静态变量,并且我还创建了一个静态方法来返回此列表。 I call this static method in the DialogFragment class so I can retrieve the list. 我在DialogFragment类中调用此静态方法,以便可以检索列表。 But I don't think this is good practice. 但是我认为这不是好习惯。 Is there a better way I can be adding an item to my list? 有什么更好的方法可以将商品添加到列表中?

TaskListFragment.java TaskListFragment.java

public class TaskListFragment extends Fragment {

private RecyclerView mRecyclerView;
private TaskAdapter mAdapter;
private List<Task> mTaskList;

private static final String ADD_DIALOG = "add_dialog";

public TaskListFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_task_list, container, false);

    mRecyclerView = view.findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    //mTaskList = createTasks();
    //mAdapter = new TaskAdapter(mTaskList);

    mRecyclerView.setAdapter(updateUI());
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_list_item, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()) {
        case R.id.add_new_task:
            FragmentManager manager = getFragmentManager();
            AddTaskFragment dialog = new AddTaskFragment();
            dialog.show(manager, ADD_DIALOG);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

/*
public List<Task> createTasks() {
    List<Task> tasks = new ArrayList<>();
    for(int i = 1; i <= 100; i++) {
        Task task = new Task();
        task.setTitle("Task #" + i);
        task.setSolved(i % 2 == 0);
        tasks.add(task);
    }

    return tasks;
}
*/

public TaskAdapter updateUI(){
    if(mAdapter == null) {
        mTaskList = new ArrayList<>();
        mAdapter = new TaskAdapter(mTaskList);
    }else {
        mAdapter.notifyDataSetChanged();
    }

    return mAdapter;
}

}

TaskAdapter.java TaskAdapter.java

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.ViewHolder> {

public static List<Task> mTaskList;

public TaskAdapter(List<Task> taskList) {
    mTaskList = taskList;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Task currentTask = mTaskList.get(position);
    holder.bindData(currentTask);
}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    private TextView mTitle;
    private CheckBox mSolved;

    private ViewHolder(View itemView) {
        super(itemView);

        mTitle = itemView.findViewById(R.id.task_title);
        mSolved = itemView.findViewById(R.id.task_solved);
    }

    private void bindData(Task task) {
        mTitle.setText(task.getTitle());
        mSolved.setChecked(task.isSolved());
    }

}

public static List<Task> getTaskList(){
    return mTaskList;
}
}

AddTaskFragment.java AddTaskFragment.java

public class AddTaskFragment extends DialogFragment {

private EditText mTaskTitle;
private List<Task> mTaskList;

private void addTask() {

    if(!mTaskTitle.getText().toString().equals("")) {
        Task task = new Task();
        task.setTitle(mTaskTitle.getText().toString());

        mTaskList = TaskAdapter.getTaskList();
        mTaskList.add(task);
    }
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    //return super.onCreateDialog(savedInstanceState);

    View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_task_dialog,null);
    mTaskTitle = view.findViewById(R.id.task_title);

    return new AlertDialog.Builder(getContext())
            .setView(view)
            .setTitle("Add Task")
            .setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    addTask();
                }
            })
            .create();

}
}

你可以调用startActivityForResult启动时addTask()这将putTask到内部添加Intent ,你会收到您的活动的onActivityResult(int requestCode, int resultCode, Intent data)

You can look into using the ViewModel pattern that Google introduced last IO. 您可以研究使用Google上次IO引入的ViewModel模式

The section talking about sharing would be especially beneficial in your situation. 有关共享的部分在您的情况下特别有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM