我的问题是当Recycler View向上和向下滚动时
我在这里如何在Fragment中设置My Recycler视图.
private void setRecyclerView() {
recyclerView.setHasFixedSize(true);
StaggeredGridLayoutManager layoutManager =
new StaggeredGridLayoutManager(2, 1);
recyclerView.setLayoutManager(layoutManager);
adapter = new TwitterTweetAdapter(getActivity());
// setting every thing false in item animator
recyclerView.setItemAnimator(new RecyclerView.ItemAnimator() {
@Override
public void runPendingAnimations() {
}
@Override
public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
return false;
}
@Override
public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
return false;
}
@Override
public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) {
return false;
}
@Override
public boolean animateChange(RecyclerView.ViewHolder viewHolder, …Run Code Online (Sandbox Code Playgroud) android adapter fragment android-viewholder android-recyclerview
如您所知,如果我们想要实现多种类型RecyclerView,我们应该提供多种CustomViewHolder扩展RecyclerView.ViewHolder.
对于exmpale,
class TextViewHolder extends RecyclerView.ViewHolder{
TextView textView;
}
class ImageViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)
然后我们必须覆盖getItemViewType.并onCreateViewHolder进入构造TextViewHolder或ImageViewHolder.
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
} else {
return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是正常的,但还有另一种方式.
我想只有一个CustomViewHolder就足够了.
class MultipleViewHolder extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
MultipleViewHolder(View itemView, int type){
if(type == …Run Code Online (Sandbox Code Playgroud) android android-layout android-view android-viewholder android-recyclerview
在互联网上的教程中,他们在RecyclerView的Adapter中设置了OnClickListener,它们以两种方式定义它:在ViewHolder内部或在BindViewHolder内部.
我的问题是哪一个是更好的方法,请推荐任何其他方法(如果有的话)
1)在ViewHolder中:
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud)
2)在BindViewHolder里面
public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {
viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读Google的示例代码,代码如下:
public class AttractionListFragment extends Fragment {
...
private class AttractionAdapter extends RecyclerView.Adapter<ViewHolder>
implements ItemClickListener {
public List<Attraction> mAttractionList;
private Context mContext;
public AttractionAdapter(Context context, List<Attraction> attractions) {
super();
mContext = context;
mAttractionList = attractions;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.d("TEST", "onCreateViewHolder");
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.list_row, parent, false);
return new ViewHolder(view, this);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Attraction attraction = mAttractionList.get(position);
holder.mTitleTextView.setText(attraction.name);
holder.mDescriptionTextView.setText(attraction.description);
Glide.with(mContext)
.load(attraction.imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.placeholder(R.drawable.empty_photo)
.override(mImageSize, …Run Code Online (Sandbox Code Playgroud) 我的firebase项目有问题.我按照firebaseGitHub文档中的步骤进行操作,但是我得到了这个例外
java.lang.RuntimeException: java.lang.NoSuchMethodException: <init>
[class android.view.View]
Run Code Online (Sandbox Code Playgroud)
这是一个ViewHolder不是内部阶级的类.
public class ProductViewHolder extends RecyclerView.ViewHolder{
public View mView;
public ImageView img;
public TextView title;
public TextView price;
public RatingBar stars;
ProductViewHolder(View itemView) {
super(itemView);
mView = itemView;
img = (ImageView) itemView.findViewById(R.id.productImg);
title = (TextView) itemView.findViewById(R.id.txtTitle);
price = (TextView) itemView.findViewById(R.id.txtPrice);
stars = (RatingBar) itemView.findViewById(R.id.ratingBar);
}
}
Run Code Online (Sandbox Code Playgroud)
这是与firebase相关的代码
@Override
protected void onStart() {
super.onStart();
// Recycler adapter
FirebaseRecyclerAdapter<Product, ProductViewHolder> adapter =
new FirebaseRecyclerAdapter<Product, ProductViewHolder>(
Product.class,
R.layout.product_list_item,
ProductViewHolder.class,
firebaseRef.child("product")) { …Run Code Online (Sandbox Code Playgroud) 根据https://developer.android.com/jetpack/compose/interop/compose-in-existing-ui#compose-recyclerview,可在 RecyclerView 中使用的可组合 ViewHolder 如下
import androidx.compose.ui.platform.ViewCompositionStrategy
class MyComposeViewHolder(
val composeView: ComposeView
) : RecyclerView.ViewHolder(composeView) {
init {
composeView.setViewCompositionStrategy(
ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
)
}
fun bind(input: String) {
composeView.setContent {
MdcTheme {
Text(input)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
看起来,每次都是bind可组合的setContent(即再次重绘)。
我使用Profile GPU Rendering测量速度,它清楚地表明 ReyclerView+ComposeViewHolder 的混合比纯 RecyclerView 或 LazyColumn 慢。
您可以在这里获取设计
我们怎样才能加快混合 RecyclerView+ComposeViewHolder 的速度?
android android-viewholder android-recyclerview android-jetpack-compose
我有个问题.点击后我试图在列表视图中更改图标.它可以正常工作,虽然不会仅修改点击的图标,但也不会修改那些未显示的图标.例如,如果我单击列表视图的第一项中的图标,则第五个图标也会更改.对于以下所有项目(列表视图的每五个项目)重复此行为.这是我的getView方法:
public class AlphabeticalAdapter extends ArrayAdapter<String>
{
int layoutResourceId;
private final Context context;
private List<String> data;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;
public AlphabeticalAdapter(Context context, int resource, List<String> data){
super(context, resource, data);
this.layoutResourceId = resource;
this.context = context;
this.data = data;
}
public View getView(int position, View convertView, ViewGroup parent) {
// View rowView = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.catalogslist_single_row, parent, false);
viewHolder = new ViewHolder();
viewHolder.catlogTitle=(TextView)convertView.findViewById(R.id.txtTitle); …Run Code Online (Sandbox Code Playgroud) android android-arrayadapter android-listview android-viewholder
我开发了一个应用程序,其中有两个帖子
我以实现双方RecyclerView和火力地堡recyclerAdapter但问题是,我不知道如何区分这两种观点,如果我用用视频查看YouTube API取得它被附加与图像视图,也得到复制到所有recyclerView项目,然后所有项目中只播放一个视频.我想要的是,如果我想要显示图像,那么该项目只能获取图像,如果我想显示视频,那么reyclerView项目只能获得视频而不重复.喜欢Instagram.我搜索了很多论坛,但没有得到任何帮助.请帮忙.我使用Firebase作为我的数据库,ViewHolders就是根据这个.
图片和视频帖子的类文件:
FirebaseRecyclerAdapter <post, postViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<post, postViewHolder>(
post.class,
R.layout.post_row_recycle_home,
postViewHolder.class,
mDatabaseReference
) {
@Override
protected void populateViewHolder(postViewHolder viewHolder, post model, int position) {
viewHolder.setimage(getApplicationContext(), model.getImage());
viewHolder.setYoutube(model.getYoutube());
}
};
mrecyclerView.setAdapter(firebaseRecyclerAdapter);
Run Code Online (Sandbox Code Playgroud)
持有人:
public static class postViewHolder extends RecyclerViewPager.ViewHolder{
View mView;
public postViewHolder(View itemView) {
super(itemView);
mView = itemView;
}
public void setYoutube(final String youtube){
final YouTubePlayerView youPlay = (YouTubePlayerView) mView.findViewById(R.id.youtuber);
youPlay.initialize("SOME KEY",
new YouTubePlayer.OnInitializedListener() …Run Code Online (Sandbox Code Playgroud) youtube android firebase android-viewholder android-recyclerview
我想给a textView内部的动画,recyclerView以便在调用时向上过渡notifyItemChanged(position)。这是我的onBindViewholder(),当适配器发生更改时,它会自动被调用:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (unfoldedIndexes.contains(position)) { // if already unfolded
bindUnfoldedState(holder, holder.getLayoutPosition());
}else{ // show the folded state}
}
public void bindUnfoldedState(ViewHolder holder, int position){
if(lc.isBtnEnabled()){
holder.Price.setText("text");
holder.Price.animate().alpha(1.0f).setDuration(500);
holder.Price.animate().translationY(-38).setDuration(500);
holder.checkText.animate().translationY(38).setDuration(500);
}else {
holder.Price.animate().alpha(0.0f).setDuration(500);
holder.Price.animate().translationY(0).setDuration(500);
holder.checkText.animate().translationY(0).setDuration(500);
}
}
Run Code Online (Sandbox Code Playgroud)
我notifyItemChanged()被这样称呼fragment onClick:
ok.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// some changes to the data
adapter.getLcns().get(Position).setBtnEnabled(true);
adapter.notifyItemChanged(Position);
}
}
Run Code Online (Sandbox Code Playgroud)
isBtnEnabled()如果etBtnEnabled(true)调用s …
在我的应用程序中,我有四种布局,“卡片列表”,“卡片杂志”,“标题”和“网格”,我制作了选项菜单以允许用户从“更改布局”选项菜单中更改它,问题发生了这是第一次运行应用程序时选择标题或网格布局,它显示唯一的第一页“10 项”结果来自改造调用
要相关,请参阅此问题
在这个应用程序的旧版本“当我使用活动时”我用标题和网格视图持有者的这行代码解决了这个问题
if(position == getItemCount() -1)
if(context instanceof MainActivity){
((MainActivity)context).getMainPagePosts();
}
Run Code Online (Sandbox Code Playgroud)
但是在这个版本中我使用了片段,所以当我试图解决它时,我创建了一个名为“WhichFragmentCalled”的接口,并将片段和 viewHolder 作为参数
public interface WhichFragmentCalled {
void whichFragmentAndViewModel(Fragment fragment, PostViewModel postViewModel);
}
Run Code Online (Sandbox Code Playgroud)
然后我在适配器和片段中使用它,就像这样
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
WhichFragmentCalled whichFragmentCalled = adapter;
whichFragmentCalled.whichFragmentAndViewModel(this,postViewModel);
}
Run Code Online (Sandbox Code Playgroud)
并使适配器实现此接口,这是完整的PostAdapter代码
public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements WhichFragmentCalled{
private Context context;
private List<Item> items;
private static final int CARD = 0;
private …Run Code Online (Sandbox Code Playgroud) java android android-fragments android-viewholder android-recyclerview