我有一个带有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(本机方法)
可以使用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来做到这一点,但是我不确定如何以及在哪里添加代码是最好的地方。将感谢任何建议。