繁体   English   中英

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

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

我正在使用RecyclerView构建列表。 当用户单击工具栏上的“ +”按钮时,将启动AlertDialog,提示用户在列表中添加项目。 我在扩展DialogFragment的单独类中构建了AlertDialog。 如何使该项目添加到List<Task>

到目前为止,我在适配器类中所做的是将List<Task> mTaskList为公共静态变量,并且我还创建了一个静态方法来返回此列表。 我在DialogFragment类中调用此静态方法,以便可以检索列表。 但是我认为这不是好习惯。 有什么更好的方法可以将商品添加到列表中?

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

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

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)

您可以研究使用Google上次IO引入的ViewModel模式

有关共享的部分在您的情况下特别有用。

暂无
暂无

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

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