我的应用程序包含一个包含工具栏(app-bar),ad-mob和fragment.thr frament的活动,其中包含一个RecyclerView.
我只是在其适配器中使用基本的RecylerView方法进行充气和onbindview .....等,我使用的是Linear-Layout Inflater.
它在大多数情况下工作正常,但有时(比如50次中的1次)它在屏幕的顶部和底部模糊并重复视图,包括ToolBar(App-Bar)和导航栏以及recyler视图的一些部分和LogCat中没有错误.
模糊区域不恒定有时它会模糊大部分屏幕,有时只有部分屏幕模糊
这是屏幕截图: - 参考我还包括适配器位置
ScreenShot: - 错误1

ScreenShot: - 错误2

我试图消除模糊,是解决了Probelm?
Update-1我尝试使用setHasSizeFixed(true),因为适配器数据不会改变我的视图大小都是90dp高度.没有解决问题.
android android-fragments recycler-adapter android-recyclerview
我想在回收站视图的基础上添加一个页脚布局.下面是我的适配器视图,它也会扩展页眉布局以及其他项目.帮助赞赏!
public class SplitMembersAdapter extends RecyclerViewAdapter<SplitMember, SplitMemberViewHolder> {
private final ArrayList<SplitMember> mSplitMembersList;
private final ImageLoader mImageLoader;
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private int splitAmount;
private boolean isAmountSplitted;
public SplitMembersAdapter(ArrayList<SplitMember> members,ImageLoader imageLoader) {
mSplitMembersList = members;
mImageLoader = imageLoader;
}
@Override
public int getItemCount() {
return mSplitMembersList.size();
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return TYPE_HEADER;
}
return TYPE_ITEM;
}
private static boolean isPositionHeader(int position) {
return position == …Run Code Online (Sandbox Code Playgroud) android android-adapter recycler-adapter android-recyclerview
我StaggeredGridLayout为我做了这个RecyclerView:

这是代码:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
Photo photo = mPhotos.get(position);
TextView titleView = ((CellViewHolder) viewHolder).titleTextView;
titleView.setText(photo.getTitle());
TextView subTitleView = ((CellViewHolder) viewHolder).subtitleTextView;
subTitleView.setText(photo.getName());
Picasso.with(mContext).load(photo.getPhotoUrl()).into(((CellViewHolder) viewHolder).imageView);
ImageView userImageOverlay = ((CellViewHolder) viewHolder).userImageOverlay;
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
if (position == 0 || position % 4 == 0) {
layoutParams.setFullSpan(true);
layoutParams.height = Math.round(Utils.convertDpToPixel(202.67f, mContext));
titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21.67f);
subTitleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12.00f);
userImageOverlay.setVisibility(View.VISIBLE);
} else if ((position - 1) % 4 == 0) {
layoutParams.setFullSpan(false);
layoutParams.height = Math.round(Utils.convertDpToPixel(360.00f, mContext)); …Run Code Online (Sandbox Code Playgroud) android staggered-gridview recycler-adapter android-recyclerview
我正在使用回收站视图来显示包含图像网格布局的项目列表.网格布局动态添加到回收器视图适配器上"onBindViewHolder"方法内的列表项.现在的问题是在每个滚动上重新创建网格布局视图.我不希望在滚动时重新创建这些视图.怎么处理?
这是代码片段
@Override
public void onBindViewHolder(final PersonViewHolder personViewHolder, final int i) {
GridLayout feedGrid = new GridLayout(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(dipToPixels(context,HomePage.SCREEN_WIDTH),dipToPixels(context,HomePage.SCREEN_WIDTH));
feedGrid.setLayoutParams(layoutParams);
feedGrid.setColumnCount(1);
imgArr = new ImageView[num];
imgArr[0] = new ImageView(context);
GridLayout.Spec row = GridLayout.spec(0, 1);
GridLayout.Spec colspan = GridLayout.spec(0, 1);
GridLayout.LayoutParams gridLayoutParam = new GridLayout.LayoutParams(row, colspan);
gridLayoutParam.setGravity(Gravity.FILL);
Picasso.with(context).load(urlArr.get(0)).error(mDrawable).placeholder(mDrawable).into(imgArr[0], new Callback() {
@Override
public void onSuccess() {
personViewHolder.feedGridLayout.setVisibility(View.VISIBLE);
personViewHolder.loadImg.setVisibility(View.GONE);
}
@Override
public void onError() {
personViewHolder.feedGridLayout.setVisibility(View.GONE);
personViewHolder.loadImg.setVisibility(View.VISIBLE);
}
});
feedGrid.addView(imgArr[0], gridLayoutParam);
personViewHolder.feedGridLayout.removeAllViews();
personViewHolder.feedGridLayout.addView(feedGrid);
}
Run Code Online (Sandbox Code Playgroud) android android-gridlayout recycler-adapter android-recyclerview
我正在使用Glide库从URL加载图像,而URL是从Graph Request(Facebook)获得的。在RecyclerAdapter中使用。当我滚动时,每个ImageView会在不到一秒钟的时间内显示错误的图片,然后进行纠正。这是代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ImageView main_image = viewHolder.main_image,
getEventCover(position, main_image);
}
private void getEventCover(int position, final ImageView img){
GraphRequest request = GraphRequest.newGraphPathRequest(
AccessToken.getCurrentAccessToken(),
event.get(position).getEventID(),
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
JSONObject data = response.getJSONObject();
try {
JSONObject cover = data.getJSONObject("cover");
String source = cover.getString("source");
Glide.with(fragment)
.load(source)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.into(img);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
);
Bundle parameters = new Bundle();
parameters.putString("fields", "cover");
request.setParameters(parameters);
request.executeAsync();
}
Run Code Online (Sandbox Code Playgroud) 我已经创建RecyclerView在 fragment里面activity,所有的工作都很好,但是当我这样做notifyDataSetChanged(),以adapter从activity通过interface,我得到一个错误" lateinit属性adapter尚未初始化 ",但我已经initialized adapter
class BuildingListFragment : Fragment(), MainActivity.EditInterface {
lateinit var adapter: BuildingListAdapter
private var mListener: OnFragmentInteractionListener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater!!.inflate(R.layout.fragment_building_list, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val buildingList = ArrayList<BuildingDetailModel>()
val …Run Code Online (Sandbox Code Playgroud) 我在项目上将适配器用于ListView / RecycleView。但是我想知道应该将哪种上下文传递给适配器?是ApplicationContext还是Activity Context(在活动上表示此意思)?据我所知,即使活动被杀死,系统也不会杀死适配器。所以我在这里有些困惑:
谢谢,
如何限制RecyclerView 显示的项目数?
如果覆盖getChildCount,我可以限制插入的数量,但这会使它仅插入该数字然后停止。我希望它继续插入/滚动,但只显示 X个项目。
(注意:每个项目的高度都可以不同,因此,限制基于数量而不是某些硬编码值非常重要。)
android recycler-adapter android-recyclerview recyclerview-layout
我正在探索Architecture Components套件的Paging库。
我的问题是在使用Paging提供的结构时实现“加载更多”视图(旋转器)。
我通常会手动实现无限滚动模式。这意味着我通常会向适配器提供一个“视图模型”列表(在建筑组件意义上不一定是视图模型,只是代表所有列表项的实体),包括一个可选附加的“加载更多”对象,适配器随后将显示为“加载”视图。
该解决方案具有某些优势,例如更好的可测试性以及使UI层尽可能简单和被动,从而使适配器与任何业务逻辑分离。
分页似乎并不容易。从我所看到的,您应该将PagedList实例流连接到该PagedListAdapter.submitList方法,魔术本身就会发生。
然后,为了添加微调器,您实际上要从视图模型中公开“网络状态”,将其分别传递给适配器,然后让适配器动态注入微调器。
就是这样在示例代码中完成的-https: //github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit /ui/PostsAdapter.kt
class PostsAdapter /* snip */ {
private var networkState: NetworkState? = null
// snip
private fun hasExtraRow() = networkState != null && networkState != NetworkState.LOADED
// snip
override fun getItemCount(): Int {
return super.getItemCount() + if (hasExtraRow()) 1 else 0
}
fun setNetworkState(newNetworkState: NetworkState?) {
val previousState = this.networkState
val hadExtraRow = hasExtraRow()
this.networkState = newNetworkState
val hasExtraRow = hasExtraRow()
if (hadExtraRow …Run Code Online (Sandbox Code Playgroud) android recycler-adapter android-architecture-components android-paging
我有一个非常独特的情况,我在recyclerview中有一个按钮,单击该按钮(初始状态为“ register”)后,会将其意图传递给片段或活动中的广播接收器,并在其中引发警报对话框,带有2个选项,是的或者没有。如果选择否,则什么也不会发生,并且对话框会消失,但是如果单击是,它将处理我在我的演示者类中定义的函数(与数据有关),并且应该将我的按钮ui状态更新为“取消”。其他方法也一样,单击“取消”将返回警报,单击“是”将切换ui文本进行注册。
现在我已经实现了如下代码(请注意,即使notifydatasetchanged对我也不起作用)。知道我做错了什么以及如何实现吗?我public void onBind(int position)的适配器功能代码:
if (repo.getIsRsvpAvailable().equals("true")) {
rsvpButton.setVisibility(View.VISIBLE);
for (int i = 0; i < mAllRSVPEventsList.size(); i++) {
if (mAllRSVPEventsList.get(i).getEvent().getEventId().equals(repo.getEventId()) && mAllRSVPEventsList.get(i).getIsAttending()) {
rsvpButton.setText("CANCEL");
rsvpButton.setOnClickListener(v -> {
Intent in = new Intent("main_rsvp_button_clicked");
in.putExtra("main_rsvp_event_id", repo.getEventId());
in.putExtra("main_rsvp_is_attending", "false");
in.putExtra("main_rsvp_item_position", position);
rsvpButton.getContext().sendBroadcast(in);
});
break;
} else {
rsvpButton.setText("RSVP");
rsvpButton.setOnClickListener(v -> {
Intent in = new Intent("main_rsvp_button_clicked");
in.putExtra("main_rsvp_event_id", repo.getEventId());
in.putExtra("main_rsvp_is_attending", "true");
in.putExtra("main_rsvp_item_position", position);
rsvpButton.getContext().sendBroadcast(in);
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的活动中广播接收器中的相应代码:
private BroadcastReceiver mEventIdReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context …Run Code Online (Sandbox Code Playgroud) java android broadcastreceiver recycler-adapter android-recyclerview
android ×10
recycler-adapter ×10
android-architecture-components ×1
java ×1
kotlin ×1
listview ×1