当前位置: 首页 > 知识库问答 >
问题:

Android:如何滚动回RecyclerView项目,在项目被编辑和重新保存后?

麻阳
2023-03-14

我有一个带有CardViews的RecyclerView列表,它运行良好。当用户在名为ActActivity的输入UI上输入数据时,创建CardViews。当用户稍后单击CardView以编辑原始数据时,onItemClick方法使用捕获适配器中正确CardView项位置的start方法再次启动ActActivity。

当用户单击UI上的Save按钮以保存编辑的数据时,ActActivity UI将关闭,并自动重新加载RecolyerView列表(MainActivity),更新的CardView将显示在RecolyerView列表中。我的问题是重新加载时的RecyclerView总是滚动到CardView项目列表的顶部。我想要列表返回到原来的CardView(点击后进行编辑)。我需要在适配器中获取原始项的位置,并在重新创建时将其传递回RecyclerView。我需要让RecyclerView知道这个位置是针对刚刚编辑过的CardView,而不是新的CardView。对如何完成有什么想法吗?

mainactivity.java:

public class MainActivity extends AppCompatActivity
    ...
    void loadData(){
    SQLiteDB sqLiteDB = SQLiteDB.getInstance(this);

    List<Contact> contactList = new ArrayList<>();

    Cursor cursor = sqLiteDB.retrieve();
    Contact contact;
    cursor...
    Adapter.addAll(contactList);

    @Override
    public void onItemClick(int position, final View view) {
        cardview = (CardView) view;
        ActActivity.start(this, Adapter.getItem(position));
    }
public class ActActivity extends AppCompatActivity {
    ...
    private Contact contact;

    public static void start(Context context){
        Intent intent = new Intent(context, ActActivity.class);
        context.startActivity(intent);
    }

    public static void start(Context context, Contact contact){
        Intent intent = new Intent(context, ActActivity.class);
        // From the OnItemClick method in the MainActivity the RecyclerView item
        // position from the Adapter is passed into a putExtra bundle that the
        // intent carries to this Activity.  The data is then copied in the onCreate()
        // below using getIntent().getParcelableExtra(). So this is to update an
        // existing CardView item.
        intent.putExtra(ActActivity.class.getSimpleName(), contact);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout.activ_act);

        // Fetch data from a parcelable object passed from the MainActivity.
        contact = getIntent().getParcelableExtra(ActActivity.class.getSimpleName());    
        ...
        // Update edited EditText lines to the data Model via contact
        contact.setDataInput(xEditText.getText().toString()); 
        // Update the data in the SQLite database.
        sqLiteDB.update(contact);
        ActActivity.this.finish();
public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Contact> contactList;

    public Adapter(Context context) {
        this.context = context;
        this.contactList = new ArrayList<>();
    }

Logcat输出:

RuntimeException:无法恢复活动{com.example.jdw.v53/com.wimso.v053.MainActivity}:java.lang.nullPointerException位于Android.app.ActivityThread.PerformResumeActivity(ActivityThread.java:2575)位于Android.app.ActivityThread.HandleResumeActivity(ActivityThread.java:2603)位于Android.app.ActivityThread.HandleResumeActivity(ActivityThread.java:2603)位于Android.app.ActivityThread$H.在Android.app.Activity.PerformResume(Activity.java:5082)在Android.app.ActivityThread.PerformResumeActivity(ActivityThread.java:2565)在Android.app.ActivityThread.HandleResumeActivity(ActivityThread.java:2603) 在Android.app.ActivityThread$H.HandleMessage(ActivityThread.java:1237) 在android.os.handler.dispatchMessage(handler.java:99) 在android.os.looper.loop(looper.java:137) 在android.app.activityThread.main(activityThread.java:4745) 在java.lang.Reflect.Method.Invokenative(本机方法) 在java.lang.Reflect.Method.Invoke(method.java:511) 在com.android.internal.os.zygoteInit$methodandargscaller.run(zygoteInit.java:786) 在com.android.internal.os.zygoteinit.main(zygoteinit.java:553) 在Dalvik.System.NativeStart.Main(本机方法) 

共有1个答案

郎子平
2023-03-14

可以使用Context.StartActivityForResult(intent,REQUEST_CODE);启动ActActivity类,如下所示

 public static void start(Context context, Contact contact,int position){
        Intent intent = new Intent(context, ActActivity.class);
        // From the OnItemClick method in the MainActivity the RecyclerView item
        // position from the Adapter is passed into a putExtra bundle that the
        // intent carries to this Activity.  The data is then copied in the onCreate()
        // below using getIntent().getParcelableExtra(). So this is to update an
        // existing CardView item.
        intent.putExtra(ActActivity.class.getSimpleName(), contact);
        intent.putExtra("position", position);
        context.startActivityForResult(intent,2);
    }

ActActivity保存完数据后,可以使用setresult(intent)将结果中的适配器位置设置回主活动

一旦您在MainActivity中的OnActivityResult()中得到结果,您就会知道编辑后您已经回来了,因此您可以使用此方法滚动到该位置,如下所示

    // Call Back method  to get the Message form other Activity  
@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data)  
{  
    super.onActivityResult(requestCode, resultCode, data);  
    // check if the request code is same as what is passed  here it is 2  
    if(requestCode==2)  
    {  
        int position=data.getIntExtra("position", 0);  
        //do all your adapter resetting here for recyclerView
        linearLayoutManager.scrollToPositionWithOffset(position, 0);
    }  
}  
 类似资料:
  • 我已经设置了一个回收器视图,每行都有文本视图和隐藏按钮。 如果用户单击该项,就会显示按钮。 如果用户单击其他项,则按钮将被隐藏。 再循环视图将位置发送到每个接口的活动,该活动更改其属性。 只要不滚动recyclerview,一切都能完美运行。 Layoutmanager.getchildat(职位) 现在,当项目超出视图时,用户滚动recyclerview,位置就会出错。每向下滚动一个用户单击的项

  • 问题内容: 其实我的问题是,当我单击该项目时,它会转到DetailsFragment。但是,当我返回到ItemListFragment时,项目编号增加了,并且发生了重复。请帮助我从中恢复..预先感谢.... ItemListGridAdapter 详细片段 问题答案: 做这个 这样,您的数据将不再重复。试试看,让我知道它是否对您有用。

  • 我已经为recyclerView创建了一个适配器和ViewHolder。我将itemView的imageButton绑定到Viewholder中。并在onBindViewHolder中设置了onClickListener。 一切正常,但问题是,当我向下滚动列表时,imageButton的选定状态会因选定项目而改变,列表底部的一些项目已显示为选中。 下面是一些代码 适配器类 接口类 活动内的接口回调

  • 我使用RecyclerView来放置JSON数据,并且在adapter中,我设置了一些特定值具有不同值的条件,然后隐藏了RelativeLayout。 在应用程序运行时,一切正常,但当我滚动数据时,隐藏或不可见的字段变得可见。 现在我想要这个问题的解决方案,当我滚动回收器视图时,数据应该处于它定义的状态,而不是因为它的位置而洗牌或改变它的状态。

  • 我试过使用descendantFocusability=“blocksdescendents”,但这不起作用。 这是我的XML代码,可以在其中找到RecyclerView 用于向RecyclersView添加数据的代码是 所有应用程序都工作得很好,唯一的问题是滚动行为。当我在HIM中添加新数据时,我希望滚动位置不会出现在RecyclersView列表的顶部。

  • 我已经创建并能够标记已添加到滚动视图中的项目。我想找到一种方法来保存和存储创建的项目,以便当用户单击关闭页面时,它们仍然保留在那里。 我想通过使用share dprefs来做到这一点,但是我不确定如何以及在哪里添加代码是最好的地方。将感谢任何建议。