【发布时间】:2017-01-20 02:57:04
【问题描述】:
我有一个带有 CardViews 的 RecyclerView 列表,它工作正常。当用户在名为 ActActivity 的输入 UI 上输入数据时,会创建 CardView。当用户稍后单击 CardView 以编辑原始数据时,onItemClick 方法会使用 start 方法再次启动 ActActivity,该方法捕获适配器中正确的 CardView 项目位置。
当用户点击 UI 上的 Save 按钮保存编辑的数据时,ActActivity UI 关闭,RecyclerView 列表自动重新加载(MainActivity),更新后的 CardView 显示在 RecyclerView 列表中。我的问题是重新加载时的 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));
}
ActActivity.java:
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();
Adapter.java:
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$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(Native Method) 在 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(本机方法) 引起:java.lang.NullPointerException 在 com.wimso.v053.MainActivity.onResume(MainActivity.java:370) 在 android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184) 在 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(Native Method) 在 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(本机方法)
【问题讨论】:
-
你试过使用马厩ID吗?还有你是如何重新加载数据的?
-
我见过一些 RecyclerView 示例使用稳定的 id,但我从未使用过。我会研究。我更新了上面的代码以显示数据是如何加载到 MainActivity 中的。
标签: android android-recyclerview android-adapter