标签: android-viewholder

Android:如何访问位置的视图(从适配器外部)

我有一个Recycler视图适配器.因此它拥有3个视图.只需每个视图都有ImageView.当用户点击图像时(3个中的1个)它创建了使用照片应用程序的新意图,并在完成后将其返回给调用者.调用者(创建RecyclerView及其适配器的activity)处理onActivityResult.从那里我需要将所提到的意图中的缩略图设置为相应的选定ImageView.

题.在我的Activity中,我如何知道要修改哪个imageView(可用3个)?我的活动只知道回收器视图适配器中的哪个项目被点击的位置.

是否有可能通过仅使用位置以某种方式获得对适配器中特定imageView的引用?所以像这样:来自活动:adapter.getImageView(position)

编辑:所以我的解决方案是:我正在跟踪适配器中的所有ImageViews并将它们的ref存储在`onBindViewHolder中的ArrayList中.所以现在我可以使用adapter.getImageView(position)

android android-viewholder android-recyclerview

7
推荐指数
1
解决办法
3657
查看次数

OnMapLoadedCallback和OnMapReadyCallback,何时使用哪个?

在使用GoogleMap Lite的ViewHolder时,作为RecyclerView中行的一部分,我正在寻找回调来在Map准备就绪时设置引脚位置.我发现下面的两个功能.

  1. OnMapLoadedCallback:https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback?hl = en

  2. OnMapReadyCallback:https://developers.google.com/android/reference/com/google/android/gms/maps/OnMapReadyCallback

两者都证明有效和可用(如下所示).因此,我很困惑,如果他们确实有任何特定的不同行为,应该在不同的场合使用,或者他们确实相似,可以互换使用?

使用OnMapLoadedCallback:

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : markers) {
        builder.include(marker.getPosition());
    }

    final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0);
    googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
        @Override
        public void onMapLoaded() {
            googleMap.moveCamera(cameraUpdate);
        }
    });
Run Code Online (Sandbox Code Playgroud)

使用OnMapReadyCallback:

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : markers) {
        builder.include(marker.getPosition());
    }

    final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0);
    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            googleMap.moveCamera(cameraUpdate);
        }
    });
Run Code Online (Sandbox Code Playgroud)

谢谢!!

android google-maps android-viewholder android-recyclerview

7
推荐指数
1
解决办法
5780
查看次数

为什么EditText中的输入值在RecyclerView中滚动时交换其位置?

在EditText中输入输入后,如果向上或向下滚动非常快,则输入值会在RecyclerView中的另一个EditText中交换其位置.
在滚动之前,数据位于第一个EditText中.
在向上和向下滚动之后,第一个EditText的值将其位置更改为第4个,并且交换是随机的.是否有任何工作来稳定数据.

这是一个示例截图

这是模型类:

public class Product {    
    public int pId;    
    public String pName;    
    public double unit_price;    
    public double discount;    
}    
Run Code Online (Sandbox Code Playgroud)

这是适配器类:

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductListHolder> {
Context context;
List<Product> productList;

public ProductAdapter(Context c, List<Product> lp){
    this.context = c;
    this.productList = lp;
}

public class ProductListHolder extends RecyclerView.ViewHolder{
    TextView tvName;
    TextView tvPrice;
    TextView tvDiscount;
    TextView tvTotal;
    EditText etQuantity;
    public ProductListHolder(View itemView) {
        super(itemView);
        tvName = (TextView) itemView.findViewById(R.id.tvName);
        tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
        tvDiscount = (TextView) itemView.findViewById(R.id.tvDiscount);
        tvTotal = (TextView) …
Run Code Online (Sandbox Code Playgroud)

android android-edittext android-viewholder android-recyclerview

7
推荐指数
3
解决办法
7291
查看次数

嵌套的recylerview滞后,而前几个滚动,然后顺利滚动?

我正在使用嵌套的RecyclerView.在垂直RecyclerView内的手段我有多个水平回收视图

我将适配器附加到父RecyclerView的onBindViewHolder方法内的水平recylerviews,如下所示.

@Override
public void onBindViewHolder(final MainViewHolder holder, final int position) {
    switch (holder.getItemViewType()) {
        case TYPE_PRODUCT:
            ((ListHolderProduct) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase());
            ((ListHolderProduct) holder).recyclerView.setAdapter(new CarouselProductsRecyclerAdapter(context
                    , browseCategoryHomePageItems.get(position).products
                    , R.layout.activity_categoryhome_products_grid_item
                    , nestedRecyclerItemClickedListener
                    , position));
            break;
        case TYPE_DEAL:
            ((ListHolderDeal) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase());
            ((ListHolderDeal) holder).recyclerView.setAdapter(new CarouselDealsRecyclerAdapter(context
                    , browseCategoryHomePageItems.get(position).dealItems
                    , R.layout.activity_categoryhome_deals_grid_item
                    , nestedRecyclerItemClickedListener
                    , position));
            break;
            //few more types like this
    }
}
Run Code Online (Sandbox Code Playgroud)

现在每当我滚动页面时,由于我将适配器连接到OnBindViewHolder上的水平RecyclerView,所以它有点滞后

并且可以有N个TYPE_PRODUCT或任何类型的水平列表.意味着可以存在多个相同类型的水平列表.

知道如何优化这个东西并提高滚动速度.

它是滞后的,因为之前每次为列表调用setAdapter.

更新我正在扩展LinearLayoutManager,并在我设置extraLayout空间已修复我的问题但我不知道这是正确的方式我是设置额外的空间如下.

 layoutManager.setExtraLayoutSpace(2 * this.getResources().getDisplayMetrics().heightPixels);
Run Code Online (Sandbox Code Playgroud)

而follwoing是自定义布局管理器类

public class PreCachingLayoutManager extends LinearLayoutManager {
private static final int DEFAULT_EXTRA_LAYOUT_SPACE = 600;
private int extraLayoutSpace = …
Run Code Online (Sandbox Code Playgroud)

performance android adapter android-viewholder android-recyclerview

7
推荐指数
2
解决办法
3249
查看次数

在片段之间切换后,RecyclerView项目消失

我的应用程序中有4个片段,它们在NavActivity中管理:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_nav);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);


    fab = (FloatingActionButton) findViewById(R.id.fab);


    // Fab for fragments
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            switch (state) {
                case ViewPager.SCROLL_STATE_DRAGGING:
                case ViewPager.SCROLL_STATE_SETTLING:
                    fab.hide(); // Hide animation
                    break;
                case ViewPager.SCROLL_STATE_IDLE:
                    switch (viewPager.getCurrentItem()) {
                        case 0:
                            fragment1.shareFab(fab); 
                        case 1:
                            fragment2.shareFab(fab); 
                            fab.setOnClickListener(new View.OnClickListener() {
                                @Override …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager android-viewholder android-recyclerview

7
推荐指数
1
解决办法
3458
查看次数

将Click侦听器添加到Generic RecyclerView Adapter

编辑

因为它是一个genericAdapter并不简单,我知道添加点击监听器的方法.这样做并不是一个好习惯onCreateViewHolder.所以这就是为什么我需要一个更好的建议

我创建了一个通用适配器RecyclerViewandroid.现在我想要一些改进它的建议.我怎么能添加clickListener.

GenericAdapter.java

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private ArrayList<T> items;
    private OnRecyclerItemClicked onRecyclerItemClicked;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public GenericAdapter(Context context, ArrayList<T> items){
        this.context = context;
        this.items = items;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onBindData(holder,items.get(position));
    }

    @Override
    public int getItemCount() { …
Run Code Online (Sandbox Code Playgroud)

android onclicklistener android-viewholder android-recyclerview

7
推荐指数
1
解决办法
2294
查看次数

使用Android中的Firebase在单个RecyclerView中获取两个不同的视图

我开发了一个应用程序,其中有两个帖子

  • 使用毕加索的图像文章
  • 使用Youtube Api的视频帖子.

我以实现双方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

7
推荐指数
2
解决办法
1059
查看次数

如果自定义列表视图行内容是动态的,如何使用视图持有者?

我已经使用基本适配器创建自定义列表视图到动态行content.row内容是以编程方式创建的(复选框,文本视图),它们包含在布局中.滚动时间问题很慢,因为不使用视图持有者.我如何使用视图持有者这种类型的自定义列表视图?任何解决方案或建议?

在此列表之后..

在此输入图像描述

android listview android-listview android-viewholder

6
推荐指数
1
解决办法
720
查看次数

Recyclerview视图可以更改其他适配器位置(非当前位置)的视图?

我有一个带有媒体播放器的回收者视图,可以在每一行上播放一首歌.我只有一个播放/停止按钮,可以改变符号.

这是我的问题:

示例1(这很好):

(对于适配器位置1),用户点击播放符号并播放该适配器位置的音乐,符号变为停止符号,然后点击停止符号,音乐停止,符号变回准备启动的播放符号音乐又来了.

例2(这是问题)

(对于适配器位置1),用户点击播放符号并播放该适配器位置的音乐,并且符号变为停止符号.如果没有再按下该按钮,他们就会点击播放符号(适配器位置3),所以现在他们正在尝试同时播放位置1和3上的歌曲.我已经修复了两首歌曲同时播放,以便当按下第二首歌曲时,播放的媒体被重置,源歌曲文件被改变为新歌曲(一次只播放一首歌曲).

即使媒体播放器表现得如此,问题仍然存在.媒体播放器在主要活动中受到控制.播放/停止按钮(imageview)图像在适配器视图中更改,当同时单击多首歌曲时,我无法改变播放/停止符号的方法.

此图像显示了按下歌曲1和歌曲3的示例.现在只播放第3首歌曲,但图像仍然显示两首歌曲同时播放.

在此输入图像描述

这是我的视图持有者,我处理更改播放/停止图像并发送歌曲点击回调:

class AddVideoAudioViewHolder extends RecyclerView.ViewHolder{

    ImageView PlayButton;
    Button AddAudioButton;
    TextView Title;
    public AddVideoAudioViewHolder(View itemView) {
        super(itemView);

        PlayButton = (ImageView) itemView.findViewById(R.id.PlayStopAudioDemo);
        PlayButton.setTag(1);
        PlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int PlayStopButtonState = (int) PlayButton.getTag();

                if (PlayStopButtonState == 1) {
                    mVideoAudioCallbacks.onClick(100 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playstop);
                    PlayButton.setTag(2);

                } else {

                    mVideoAudioCallbacks.onClick(200 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playarrow);
                    PlayButton.setTag(1);
                }


            }
        });
Run Code Online (Sandbox Code Playgroud)

这是我在主要活动中处理两首歌曲播放情况的方法:

public void PlaySong (int SongNumber, int ObjectInt){


    if (mp == null) {

        mp = new …
Run Code Online (Sandbox Code Playgroud)

android android-mediaplayer android-viewholder android-recyclerview

6
推荐指数
1
解决办法
9199
查看次数

RecyclerView:指定的子级已有父级.您必须首先在孩子的父母上调用removeView()

我有一个RecyclerView我在下面得到例外的地方.我只是在Crashlytics上获得了例外,尽管我每天都在大量使用这项活动,但我自己从未设法重现这个问题.

我夸大其观点的方式onCreateViewHolder是:

View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item, parent, false);
Run Code Online (Sandbox Code Playgroud)

还有另一种视图类型,它来自MoPub原生广告.

知道问题是什么吗?

Caused by java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the childs parent first.
           at android.view.ViewGroup.addViewInner(ViewGroup.java:4438)
           at android.view.ViewGroup.addView(ViewGroup.java:4274)
           at android.view.ViewGroup.addView(ViewGroup.java:4215)
           at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:711)
           at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
           at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7877)
           at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7835)
           at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7823)
           at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1565)
           at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
           at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1325)
           at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1061)
           at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4726)
           at android.view.Choreographer$CallbackRecord.run(Choreographer.java:894)
           at android.view.Choreographer.doCallbacks(Choreographer.java:696)
           at android.view.Choreographer.doFrame(Choreographer.java:628)
           at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:880)
           at android.os.Handler.handleCallback(Handler.java:815)
           at android.os.Handler.dispatchMessage(Handler.java:104)
           at android.os.Looper.loop(Looper.java:207)
           at android.app.ActivityThread.main(ActivityThread.java:5728)
           at java.lang.reflect.Method.invoke(Method.java)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) …
Run Code Online (Sandbox Code Playgroud)

android android-viewholder recycler-adapter android-recyclerview

6
推荐指数
0
解决办法
1211
查看次数