【问题标题】:How to fetch new data from an activity that was launched through an Intent?如何从通过 Intent 启动的活动中获取新数据?
【发布时间】:2017-08-28 12:39:41
【问题描述】:

这是一个有点复杂的问题。在我的 RecyclerView 的自定义适配器的ViewHolder 中,我实现了一个onClickListener 并通过onClick,我传递了一个意图,该意图会触发EditItemActivity,其中包含文本和recyclerview 列表项位置作为额外内容。在EditItemActivity 中,我有一个TextView,其中包含从意图传递的文本和一个“保存更改”按钮。该文本属于我的 Recyclerview 列表中的特定列表项。更改文本后,我希望应用程序返回到带有列表的主屏幕,并使用新文本更新该特定项目。

到目前为止,这是我能够成功实现的:

  1. 每当单击列表项时,EditItemActivity 就会启动。
  2. 活动启动时,它的 textview 与 onClick 启动活动的列表项具有相同的文本。

我要补充的:

  • 当我更改 EditItemActivity 中的文本并单击“保存更改”按钮时,它会更新同一列表项的文本。

这是我的实现。这是我的适配器中的ViewHolder,其中包含onClick

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView todoView;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            todoView = itemView.findViewById(R.id.to_do_display);
        }

        @Override
        public void onClick(View view) {
            Toast.makeText(context, "position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, EditItemActivity.class);
            intent.putExtra("data", todoView.getText());
            intent.putExtra("position", getAdapterPosition());
            context.startActivity(intent);
        }
    }

这是我更新该列表项文本的尝试:

public class EditItemActivity extends AppCompatActivity {

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

        final ToDoData toDoData = new ToDoData(this);
        final ToDoAdapter toDoAdapter = new ToDoAdapter(this);

        final EditText editToDo = (EditText)findViewById(R.id.edit_todo_item);
        Button button = (Button)findViewById(R.id.save_changes);
        final String text = getIntent().getExtras().getString("data");
        final String position = getIntent().getExtras().getString("position");
        editToDo.setText(text);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(editToDo.getText().toString() != text){
                    toDoData.setToDo(editToDo.getText().toString());
                    toDoAdapter.notifyDataSetChanged();
                    finish();
                }
            }
        });
    }
}

根据请求添加代码

具有列表视图的类的代码:

public class MainActivity extends AppCompatActivity {

    private List<ToDoData> toDoList = new ArrayList<>();

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

        final ToDoAdapter toDoAdapter = new ToDoAdapter(toDoList, this);

        final EditText toDoInput = (EditText)findViewById(R.id.add_todo);
        Button toDoAdd = (Button)findViewById(R.id.add_item);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        RecyclerView toDoDisplay = (RecyclerView) findViewById(R.id.toDoDisplayRecyclerView);
        toDoDisplay.setAdapter(toDoAdapter);
        toDoDisplay.setHasFixedSize(true);
        toDoDisplay.setLayoutManager(layoutManager);


        toDoAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToDoData newToDoData = new ToDoData(MainActivity.this);
                newToDoData.setToDo(toDoInput.getText().toString());
                toDoList.add(newToDoData);
                toDoAdapter.notifyDataSetChanged();
                toDoInput.setText("");
            }
        });
    }
}

适配器代码:

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

    private List<ToDoData> toDoList;
    private Context context;

    public ToDoAdapter(List<ToDoData> todoList, Context context) {
        this.toDoList = todoList;
        this.context = context;
    }

    public ToDoAdapter(Context context){}

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView todoView;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            todoView = itemView.findViewById(R.id.to_do_display);
        }

        @Override
        public void onClick(View view) {
            Toast.makeText(context, "position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, EditItemActivity.class);
            intent.putExtra("data", todoView.getText());
            intent.putExtra("position", getAdapterPosition());
            context.startActivity(intent);
        }
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        ToDoData todoPosition = toDoList.get(position);

        holder.todoView.setText(todoPosition.getToDo());
    }

    @Override
    public int getItemCount() {
        return (toDoList == null) ? 0 : toDoList.size();
    }
}

ToDoData.class

public class ToDoData implements Serializable{
    private String toDoString;

    public ToDoData(String todoString){
        this.toDoString = todoString;
    }

    public ToDoData(Context context){}

    public String getToDo() {
        return toDoString;
    }

    public void setToDo(String toDoString) {
        this.toDoString = toDoString;
    }
}

【问题讨论】:

  • 您能否分享具有列表视图的活动代码和填充视图的适配器代码?
  • 检查编辑... @SumitJha

标签: android android-intent android-recyclerview onclicklistener android-viewholder


【解决方案1】:
  1. 让你的 ToDoData 类实现 Serializable。

    public class ToDoData implements Serializable{}
    
  2. 现在,通过 Intent 将 List&lt;ToDoData&gt;positondata 一起传递到 EditItemActivity:

    Intent intent = new Intent(MainActivity.this, EditItemActivity.class);
    intent.putExtra("data", todoView.getText());
    intent.putExtra("position", getAdapterPosition());
    //along with data and position, we are passing the list as well.
    intent.putExtra("LIST", (Serializable) toDoList); //this 'list' is your toDoList that you pass to the adapter (and gets populated into the view)
    startActivity(intent);
    
  3. 现在,在您的 EditItemActivity 中,

    从意图中接收列表:

    Intent i = getIntent();
    list = (List<ToDoData>) i.getSerializableExtra("LIST");
    

    并将按钮点击的监听器设置为,

    toDoAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // set the new input of user from toDoInput into the list 
            list.set(position, *object_of_ToDoData_with_updated_user_input*);
            startActivity(new Intent(EditItemActiviy.this, MainActivity.class));
    
        }
    });
    
  4. 在 MainActivity 内部,

    @Override
    protected void onResume() {
        super.onResume();
        toDoAdapter.notifyDataSetChanged();
    
    }
    

【讨论】:

  • 我在哪里放置 2 号?
  • MainActivity 内部。 (我们需要将列表从 MainActivity 传递给 EditItemActivity)
  • myIntent 来自哪里?
  • 我已经编辑了代码以使其清晰。如果您需要更多帮助,请告诉我。
  • 问题是在第2个中,MainActivity无法访问toDoViewgetAdapterPosition。我已经通过我的适配器传递了这个意图。你不觉得我应该把它放在那里吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多