嗨,我需要停止RecyclerView在滚动时重新加载数据,但我不知道如何:(和我搜索它,但我找不到任何答案
适配器:mPostAdapterNew
RecyclerView:MPostRV_new
你们能帮我吗?预先感谢:D
编辑:这是我的代码:
private void setupAdaptaterNew() {
mPostAdapterNew = new FirebaseRecyclerAdapter<Post, PostViewHolder>(
Post.class,
R.layout.item_layout_evenimente,
PostViewHolder.class,
mPostRef
) {
@Override
public void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) {
final long EndZi = viewHolder.setEndZi(model.getEndZi());
final int EndLuna = viewHolder.setEndLuna(model.getEndLuna());
final int EndAn = viewHolder.setEndAn(model.getEndAn());
Calendar cal = Calendar.getInstance();
final Button btnAddEvent = viewHolder.itemView.findViewById(R.id.BtnParticip);
final Button btnDeleteEvent = viewHolder.itemView.findViewById(R.id.BtnNuParticip);
final int EndOra = viewHolder.setEndOra(model.getEndOra());
final int EndMinute = viewHolder.setEndMinute(model.getEndMinute());
final String headline = viewHolder.setHeadline(model.getHeadline());
final String locatie = viewHolder.setStrada(model.getStrada());
final String organizator = viewHolder.setOrganizator(model.getOrganizator());
final String descriere = viewHolder.setPostDescriere(model.getDescriere());
final ContentResolver cr = getActivity().getContentResolver();
final ContentValues values = new ContentValues();
final ContentResolver crReminder = getActivity().getContentResolver();
final ContentValues valuesReminder = new ContentValues();
final Uri event = null;
final TextView nr_persoane = viewHolder.itemView.findViewById(R.id.nr_persoane);
final String key = this.getRef(position).getKey();
final Cursor data = mDatabaseHelper.getData();
cal.set(Calendar.HOUR, 24);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.MONTH, EndLuna);
cal.set(Calendar.DAY_OF_MONTH, (int) EndZi);
cal.set(Calendar.YEAR, EndAn);
if (Calendar.getInstance().before(cal)) {
StorageReference storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(model.getImageUrl());
Glide.with(Fragment_events_new.this)
.using(new FirebaseImageLoader())
.load(storageReference)
.asBitmap()
.centerCrop()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
viewHolder.postIV.setImageBitmap(resource);
}
});
viewHolder.setHeadline(model.getHeadline());
viewHolder.setZiua(model.getZiua());
viewHolder.setLuna(model.getLuna());
viewHolder.setOra(model.getOra());
viewHolder.setOrganizator(model.getOrganizator());
viewHolder.setCategoria(model.getCategoria());
viewHolder.setStrada(model.getStrada());
viewHolder.setLocalitatea(model.getLocalitatea());
viewHolder.setPostDescriere(model.getDescriere());
viewHolder.setNrPersoane(model.getNrPeople());
} else {
viewHolder.itemView.setVisibility(View.GONE);
viewHolder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
}
btnAddEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getActivity(), "Permisii insuficiente.\n Va rugam sa activati permisiunea de CALENDAR", Toast.LENGTH_LONG).show();
NoPermissions();
} else {
addEvent(values, EndZi, EndAn, EndLuna, EndOra, EndMinute, headline, descriere, locatie, organizator, event, cr, valuesReminder, crReminder);
int i = viewHolder.setNrPersoane(model.getNrPeople()) + 1;
nr_persoane.setText(String.valueOf(i));
mPostRef.child(key).child("nrPeople").setValue(i);
}
}
});
btnDeleteEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
deleteEvent(data, headline);
btnAddEvent.setVisibility(View.VISIBLE);
btnDeleteEvent.setVisibility(View.GONE);
int i = viewHolder.setNrPersoane(model.getNrPeople()) - 1;
nr_persoane.setText(String.valueOf(i));
mPostRef.child(key).child("nrPeople").setValue(i);
}
});
if (CheckDB(headline)) {
btnAddEvent.setVisibility(View.GONE);
btnDeleteEvent.setVisibility(View.VISIBLE);
} else {
btnAddEvent.setVisibility(View.VISIBLE);
btnDeleteEvent.setVisibility(View.GONE);
}
}
};
}
@SuppressLint("MissingPermission")
private void addEvent(ContentValues values, float EndZi, int EndAn, int EndLuna, int EndOra, int EndMinute,
String headline, String descriere, String locatie, String organizator,
Uri event, ContentResolver cr, ContentValues valuesReminder, ContentResolver crReminder) {
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(EndAn, EndLuna, (int) EndZi, EndOra, EndMinute);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(EndAn, EndLuna, (int) EndZi, EndOra, EndMinute);
endMillis = endTime.getTimeInMillis();
//Add Values
values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.TITLE, headline);
values.put(CalendarContract.Events.DESCRIPTION, descriere); //TODO change description here!
TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.DTEND, endMillis);
values.put(CalendarContract.Events.EVENT_LOCATION, locatie);
values.put(CalendarContract.Events.ORGANIZER, organizator);
event = cr.insert(CalendarContract.Events.CONTENT_URI, values);
valuesReminder.put(CalendarContract.Reminders.DTSTART, startMillis);
Uri REMINDERS_URI_DAY = Uri.parse(getCalendarUriBase(true) + "reminders");
valuesReminder = new ContentValues();
valuesReminder.put("event_id", Long.parseLong(event.getLastPathSegment()));
valuesReminder.put("method", 1);
valuesReminder.put("minutes", 1440);
Uri uriReminderDay = crReminder.insert(REMINDERS_URI_DAY, valuesReminder);
Uri REMINDERS_URI_HOUR = Uri.parse(getCalendarUriBase(true) + "reminders");
valuesReminder = new ContentValues();
valuesReminder.put("event_id", Long.parseLong(event.getLastPathSegment()));
valuesReminder.put("method", 1);
valuesReminder.put("minutes", 120);
Uri uriReminder = crReminder.insert(REMINDERS_URI_HOUR, valuesReminder);
createDialog(headline, "Ati adaugat evenimentul in calendar!");
String event_id = String.valueOf(Long.parseLong(event.getLastPathSegment()));
AddData(headline, event_id);
}
private void deleteEvent(Cursor data, String headline) {
while (data.moveToNext()) {
if (data.getString(1).equals(headline)) {
Uri deleteUri = null;
deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, Long.parseLong(data.getString(2)));
int rows = getActivity().getContentResolver().delete(deleteUri, null, null);
createDialog(headline, "Ati sters evenimentu din calendar!");
mDatabaseHelper.deleteData(headline, data.getString(2));
}
}
}
private boolean CheckDB(String headline) {
Cursor data = mDatabaseHelper.getData();
while (data.moveToNext()) {
if (data.getString(1).equals(headline)) {
return true;
}
}
return false;
}发布于 2018-04-01 18:02:50
基本上,您需要为循环视图适配器创建一个类(您应该使用recycleview而不是listview,因为它是新的,然后是listview,并且具有listview没有的许多优化和新功能)。
MyRecyclerViewAdapter
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
private List<FeedItem> feedItemList;
private Context mContext;
public MyRecyclerViewAdapter(Context context, List<FeedItem> feedItemList) {
this.feedItemList = feedItemList;
this.mContext = context;
}
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
CustomViewHolder viewHolder = new CustomViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
FeedItem feedItem = feedItemList.get(i);
//Render image using Picasso library
if (!TextUtils.isEmpty(feedItem.getThumbnail())) {
Picasso.with(mContext).load(feedItem.getThumbnail())
.error(R.drawable.placeholder)
.placeholder(R.drawable.placeholder)
.into(customViewHolder.imageView);
}
//Setting text view title
customViewHolder.textView.setText(Html.fromHtml(feedItem.getTitle()));
}
@Override
public int getItemCount() {
return (null != feedItemList ? feedItemList.size() : 0);
}
class CustomViewHolder extends RecyclerView.ViewHolder {
protected ImageView imageView;
protected TextView textView;
public CustomViewHolder(View view) {
super(view);
this.imageView = (ImageView) view.findViewById(R.id.thumbnail);
this.textView = (TextView) view.findViewById(R.id.title);
}
}}
正如您在上面的示例中所看到的,所有的项目都已经被获取(准备显示,而不是每次用户向上/向下滚动列表时得到它们)。其次,有一些像onCreateViewHolder这样的函数,您需要在其中创建自己的视图保持器(膨胀布局,然后从布局中创建一个保存所有视图的视图,这些视图将用于显示要在列表中显示的数据)。第二,onBindViewHolder用于将持有者中的视图与适配器从其构造函数获得的数据绑定(连接)。
在实现适配器之后,应该按照以下方式使用它:活动/片段中的某个地方
...
List<FeedItem> data = manager.getItems();
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(MainActivity.this, feedsList);
mRecyclerView.setAdapter(adapter);
...这里需要注意以下几点: 1) manager.getItems();是一个可以从哪里获取项目的管理器,为了使用它,您需要知道从哪里获取这些项(web/存储或其他源),然后您需要实现它(有许多站点解释了如何实现它)。2)如果使用的是片段,则应该使用MainActivity.this getActivity()代替
您可以看到更多细节,这里
希望它能帮助你理解如何去做。
发布于 2020-02-14 01:54:29
嗨,我在这里遇到了同样的问题,特别是如果我必须使用一个小的缓存将一个内侧的图像加载到中,那么解决了我这里的问题
MPostRV_new=view.findViewById(R.id.your_layout);
MPostRV_new.setHasFixedSize(true);
MPostRV_new.setLayoutManager(new LinearLayoutManager(getContext()));
MPostRV_new.setItemAnimator(null);
MPostRV_new.setItemViewCacheSize(50);有关更多信息,请查看此资源setItemViewCacheSize
发布于 2018-03-31 19:15:24
使用RecyclerView作为组件的要点是,每次滚动时它都会重新构建可见项,这样它就会加载数据,因此不能“阻止”它。
您有两个选项::
ListView。它将立即加载所有项,然后如果只显式调用update,则会进行更新。https://stackoverflow.com/questions/49591332
复制相似问题