【问题标题】:How to update a ScrollView after adding an item in Android Studio?在 Android Studio 中添加项目后如何更新 ScrollView?
【发布时间】:2021-04-04 13:51:22
【问题描述】:

添加 RadioButton 后如何刷新 ScrollView。实际上,我有一个带有布局的项目类(任务),我在其中定义了我的对象,ScrollView 的适配器类,带有布局的 MainActivity 和带有布局的另一个 Activity。在主布局中,我从 3 个“任务”开始,并通过一个浮动按钮导航到带有纯文本和按钮的第二个 Activity。如果我输入文本并按下按钮,它不会将我的项目添加到 MainActivity 的 ScrollView,直到我检查单选按钮。我想要做的是,当我回到 MainActivity 的布局时,无需检查任何单选按钮即可查看新任务。

我的适配器类中有 notifyData,可以完美地更新从字符串添加的 FIXED 任务。我也尝试使用其他类的 notifyData 来更新 ScrollView 但没有任何变化。


主要活动

package com.example.dotomorrow;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    public static final String KEY_ID_COUNTER = "ID_COUNTER";

    private int id_number = 0;
    private RecyclerView recyclerview_Task;
    private RecyclerViewTaskAdapter adapter;
    private FloatingActionButton floatingbutton_TaskAdd;

    public static ArrayList<Task> Tasks;

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

        Initialing();




        id_number++;
        Tasks.add(new Task(id_number, "Do your homework", false));
        adapter.setTasks(Tasks);

        id_number++;
        Tasks.add(new Task(id_number, "Breakfast", false));
        adapter.setTasks(Tasks);

        id_number++;
        Tasks.add(new Task(id_number, "Hello", false));
        adapter.setTasks(Tasks);


        floatingbutton_TaskAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                id_number++;
                Intent intent = new Intent(MainActivity.this, TaskAddActivity.class);
                intent.putExtra(KEY_ID_COUNTER,id_number);
                startActivity(intent);

            }
        });







    }
    private void Initialing() {
        adapter = new RecyclerViewTaskAdapter(this);
        recyclerview_Task = findViewById(R.id.recyclerview_Task);
        floatingbutton_TaskAdd = findViewById(R.id.floatingbutton_TaskAdd);

        recyclerview_Task.setAdapter(adapter);
        recyclerview_Task.setLayoutManager(new GridLayoutManager(this, 1));

        Tasks = new ArrayList<>();

    }


//    public void TaskAdd(int id, String text, boolean isDone) {
//        Tasks.add(new Task(id, text, isDone));
//        adapter.setTasks(Tasks);
//    }



}

主要活动(布局)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:theme="@style/Platform.MaterialComponents.Light"
    android:id="@+id/relativelayout_main">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollview_Task">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/constraintlayout_Task">


            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerview_Task"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:layout_marginTop="10dp"
                android:layout_marginStart="10dp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </ScrollView>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/constraintlayout_FloatingButton"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="10dp">


        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/floatingbutton_TaskAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:rippleColor="#FFF"
            android:elevation="5dp"
            android:backgroundTint="#FF9800"
            android:clickable="true"
            android:src="@drawable/ic_floatingbutton_add"
            app:maxImageSize="35dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:srcCompat="@tools:sample/avatars" />
    </androidx.constraintlayout.widget.ConstraintLayout>


</RelativeLayout>

任务

package com.example.dotomorrow;

import android.opengl.Visibility;

public class Task {

    private int id;
    private String text;
    private boolean isdone;

    public Task(int id, String text, boolean isdone) {
        this.id = id;
        this.text = text;
        this.isdone = isdone;
    }

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", text='" + text + '\'' +
                ", isdone=" + isdone +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public boolean isIsdone() {
        return isdone;
    }

    public void setIsdone(boolean isdone) {
        this.isdone = isdone;
    }


    
}

项目布局(与任务类无关/无关)

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.radiobutton.MaterialRadioButton
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/parent"
    android:textStyle="normal"
    android:textSize="16sp"
    android:layout_marginStart="10dp">

</com.google.android.material.radiobutton.MaterialRadioButton>

RecyclerViewTaskAdapter

package com.example.dotomorrow;

import android.content.Context;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class RecyclerViewTaskAdapter extends RecyclerView.Adapter<RecyclerViewTaskAdapter.ViewHolder> {
    private static final String TAG = "RecyclerViewTaskAdapter";

    ArrayList<Task> tasks = new ArrayList<>();
    private Context mContext;

    public RecyclerViewTaskAdapter(Context mContext) {
        this.mContext = mContext;
    }


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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder: Called");
        holder.parent.setText(tasks.get(position).getText());

        holder.parent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (removeTask(tasks.get(position))) {
                    Toast.makeText(mContext, "Done", Toast.LENGTH_SHORT).show();
                    holder.parent.setChecked(false);
                    notifyDataSetChanged();
                }else{
                    Toast.makeText(mContext, "Something went wrong", Toast.LENGTH_SHORT).show();
                }
            }
        });

}

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



    public void setTasks(ArrayList<Task> tasks) {
        this.tasks = tasks;
        notifyDataSetChanged();
    }

public class ViewHolder extends RecyclerView.ViewHolder{
    public RadioButton parent;
    public ViewHolder(View itemView) {
        super(itemView);
        parent = itemView.findViewById(R.id.parent);

    }
}


    private boolean removeTask(Task task) {
        return tasks.remove(task);
    }
}

任务添加活动

package com.example.dotomorrow;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;

public class TaskAddActivity extends AppCompatActivity {

    private int id_number;
    private RecyclerViewTaskAdapter adapter;
    private Button button_TaskAdd;
    private EditText edittext_Task;
    private Spinner spinner_TaskWhenToDo;
    private ArrayList<Task> Tasks;

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


        System.out.println(id_number);


        button_TaskAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //ToDo Bug adaugare task

                Tasks.add(new Task(id_number, edittext_Task.getText().toString(), false));
                adapter.setTasks(Tasks);
                adapter.notifyDataSetChanged();


                onBackPressed();
                Toast.makeText(TaskAddActivity.this, "Task added succsessfully", Toast.LENGTH_SHORT).show();

            }
        });


    }


    private void Initialing() {
        Intent intent = getIntent();
        id_number = intent.getIntExtra(MainActivity.KEY_ID_COUNTER,0);
        adapter = new RecyclerViewTaskAdapter(this);
        button_TaskAdd = findViewById(R.id.button_TaskAdd);
        edittext_Task = findViewById(R.id.edittext_Task);
        spinner_TaskWhenToDo = findViewById(R.id.spinner_TaskWhenToDo);
        Tasks = MainActivity.Tasks;

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
//        Intent intent = new Intent(TaskAddActivity.this, MainActivity.class);
//        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
//        startActivity(intent);
    }
}

任务添加布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TaskAddActivity">

    <Button
        android:id="@+id/button_TaskAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Create"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginBottom="35dp" />

    <EditText
        android:id="@+id/edittext_Task"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Task"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Spinner
        android:id="@+id/spinner_TaskWhenToDo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:entries="@array/task_when_to_do"
        app:layout_constraintEnd_toEndOf="@+id/edittext_Task"
        app:layout_constraintStart_toStartOf="@+id/edittext_Task"
        app:layout_constraintTop_toBottomOf="@+id/edittext_Task" />

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: java android arraylist


    【解决方案1】:

    尝试调用您的 ScrollView: scrollview_Task.invalidate() 和(或)scrollview_Task.requestLayout()

    【讨论】:

    • 不,它没有解决问题,我仍然需要检查(删除)一个任务以显示添加的任务。如果我添加多个任务并且我只检查(删除)一个它会添加所有添加的任务,这很有趣。我相信适配器中的某些东西他喜欢展示整个项目。
    【解决方案2】:

    解决方案:问题是在添加项目后没有调用 onBindViewHolder(在添加项目之前使用了每个 adapter.notifyDataSetChanged()。所以有人让我想到了一个通知一次的无限线程的想法过了一会儿,onBindViewHolder 终于被调用了。

    package com.example.dotomorrow;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.GridLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.RelativeLayout;
    import android.widget.ScrollView;
    import android.widget.Toast;
    
    import com.google.android.material.floatingactionbutton.FloatingActionButton;
    
    import java.sql.Ref;
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class MainActivity extends AppCompatActivity {
    
        public static final String KEY_ID_COUNTER = "ID_COUNTER";
    
        private int id_number = 0;
        private RecyclerView recyclerview_Task;
        private RecyclerViewTaskAdapter adapter;
        private FloatingActionButton floatingbutton_TaskAdd;
    
        public static ArrayList<Task> Tasks;
    
    
        private ScrollView scrollview_Task;
    //    RelativeLayout relativelayout_main;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Initialing();
            Refresh_Timer();
    
    
    
    
            id_number++;
            Tasks.add(new Task(id_number, "Do your homework", false));
            adapter.setTasks(Tasks);
    
            id_number++;
            Tasks.add(new Task(id_number, "Breakfast", false));
            adapter.setTasks(Tasks);
    
            id_number++;
            Tasks.add(new Task(id_number, "Hello", false));
            adapter.setTasks(Tasks);
    
    
    
    
    //        scrollview_Task.requestLayout();
    //        scrollview_Task.postInvalidate();
    
    
    
    
    
            floatingbutton_TaskAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    id_number++;
                    Intent intent = new Intent(MainActivity.this, TaskAddActivity.class);
                    intent.putExtra(KEY_ID_COUNTER,id_number);
                    startActivity(intent);
    
                    Toast.makeText(MainActivity.this, "At First Point", Toast.LENGTH_SHORT).show();
    //                scrollview_Task.invalidate();
    //                scrollview_Task.requestLayout();
    
    
    
                }
            });
    
    
            Toast.makeText(this, "At Second Point", Toast.LENGTH_SHORT).show();
            System.out.println("At Second Point");
    //        scrollview_Task.invalidate();
    //        scrollview_Task.requestLayout();
    
    
    
    
        }
        private void Initialing() {
            adapter = new RecyclerViewTaskAdapter(this);
            recyclerview_Task = findViewById(R.id.recyclerview_Task);
            floatingbutton_TaskAdd = findViewById(R.id.floatingbutton_TaskAdd);
    
            recyclerview_Task.setAdapter(adapter);
            recyclerview_Task.setLayoutManager(new GridLayoutManager(this, 1));
    
            Tasks = new ArrayList<>();
    
    
    
    //        relativelayout_main = findViewById(R.id.relativelayout_main);
            scrollview_Task = findViewById(R.id.scrollview_Task);
    
        }
    
    
    //    public void TaskAdd(int id, String text, boolean isDone) {
    //        Tasks.add(new Task(id, text, isDone));
    //        adapter.setTasks(Tasks);
    //    }
    
    
    
        private void Refresh_Timer() {
            new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Refresh();
                            System.out.println("YEP");
                        }
                    });
                }
            },0,5000);
        }
    
    
        private void Refresh() {
            adapter.notifyDataSetChanged();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多