标签: android-viewholder

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

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

在此列表之后..

在此输入图像描述

android listview android-listview android-viewholder

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

viewHolder.getAdapterPosition()始终返回-1

由于某种原因,我无法使用,holder.getAdapterPosition()因为它总是返回-1但holder.getLayoutPosition()返回一个位置就好了.

我的onCreateViewHolder:

@覆盖

public ViewHolder onCreateViewHolder(ViewGroup parent,
                                     int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_item, parent, false);


    ViewHolder vh = new ViewHolder(this, v);
    return vh;
}
Run Code Online (Sandbox Code Playgroud)

我的ViewHolder构造函数:

public ViewHolder(DirectoryListAdapter adapter, View linear) {
            super(linear);
            this.adapter = adapter;
            this.linear = (LinearLayout) linear;
            this.entryName = (TextView) linear.findViewById(R.id.item_name);
            this.entryImage = (ImageView) linear.findViewById(R.id.item_image);

}
Run Code Online (Sandbox Code Playgroud)

我看起来更远,getAdapterPosition看起来像这样:

 public final int getAdapterPosition() {
            final ViewParent parent = itemView.getParent();
            if (!(parent instanceof RecyclerView)) {
                return -1;
            } …
Run Code Online (Sandbox Code Playgroud)

android android-support-library android-viewholder android-recyclerview

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

RecyclerView.hasStableIds(true)是否按itemViewType分组?

我有一个RecyclerViewRecyclerView.Adapter它的备份数据从一个即将Cursor通过Loader.数据包含两种类型的项目:AB通过一个返回UNION ALL.每个getItemViewType返回不同的ints(见下面的注释).将AB实体从不同的SQLite数据库表,他们都_id从开始1,所以这是非常喜欢,有将是一个B_id是与现有的A,反之亦然.

设置setHasStableIds(true)上述适配器是否安全?
当光标同时具有相同ID的As和B以及动画或回收出错时,可能会发生奇怪的情况?

注意:所有其他部分Adapter都非常标准:getItemViewType通过返回R.layout.a_view或实现R.layout.b_view.ViewHolder对于onCreateViewHolder使用开关创建的每种类型,还有单独的子类itemViewType.

当我离开另一个活动,修改一些数据然后按后退按钮(感谢Loaders我猜)时,所有项目都会正确显示甚至动画.

android android-viewholder recycler-adapter android-recyclerview

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

RecyclerView Recycled ViewHolder Image查看错误的大小

我有一个带有不同View Holders的回收站视图.

一些视图持有者具有图像视图,我将其传递到Glide以显示图像.

问题是,当回收者视图开始回收视图时,imageview宽度/高度是回收视图的宽度/高度,然后他们会错误地显示图像.

这是我的ImageView:

<ImageView
    android:id="@+id/image"
    android:layout_marginTop="@dimen/feed_item_margin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
Run Code Online (Sandbox Code Playgroud)

这被传递到Glide

Glide.with(itemView.getContext())
    .load(Uri.parse(MediaUtils
    .getMedia(feedContent).getMediaUrl()))
    .placeholder(R.drawable.placeholder)
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .crossFade().into(image);
Run Code Online (Sandbox Code Playgroud)

这种方法很有效,直到Recyclerview开始回收,因此recyclerview中的第一个图像看起来就像是它的外观.

在此输入图像描述

但是,当您从项目滚动并向后滚动时,它看起来像这样:

在此输入图像描述

因此图像变得扭曲,并不是父母的全宽.

我希望图像视图包装内容,因为所有图像都是不同的高度等.为了测试这个,我添加了这一行,holder.setIsRecyclable(false);以防止这个特定的持有人和所有显示的图像的回收,但是,正如预期的那样,这给了刺耳的感觉影响.

所以我尝试重置方法中的图像视图的参数,OnViewRecycled如下所示:

@Override
public void onViewRecycled(AbstractHolder viewHolder){
    super.onViewRecycled(viewHolder);

    int position = viewHolder.getAdapterPosition();
    IFeedContent content = mFeedContentList.get(position);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    params.setMargins(0, (int) Utils.dpTopx(mContext,10),0,0);
    params.gravity = Gravity.CENTER;

    if(isImage(content)){
        viewHolder.getImageView().setImageURI(null);
        viewHolder.getImageView().setImageDrawable(null);
        viewHolder.getImageView().setImageResource(0);
        viewHolder.getImageView().setLayoutParams(params);
    }
} 
Run Code Online (Sandbox Code Playgroud)

在这个我重新创建xml中的参数但它不起作用.isImage() 这只是检查对象的mimetype的方法.

任何人都可以帮忙吗?这非常令人沮丧.

对此有任何帮助表示赞赏.

EDIT 适配器已添加

public class ContentFeedAdapter extends RecyclerView.Adapter<AbstractHolder> {

    private List<IFeedContent> mFeedContentList;
    private Context mContext;
    private …
Run Code Online (Sandbox Code Playgroud)

android android-viewholder android-recyclerview android-glide

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

viewholder内的getActivity()

我创建了一个Recyclerview,包括itemobjects,Adapter,viewholder和activity.

Recyclerview工作正常.

我的问题是当从Recyclerview点击某个项目时,我想将用户定向到TicketDetails活动.

我有代码来获取被点击的项目及其在视图持有者中的位置,但是当我尝试在视图持有者内部创建新活动时

startActivity(new Intent(getActivity(), TicketDetails.class));
Run Code Online (Sandbox Code Playgroud)

我无法解决getActivity()

ViewHolder

public class TicketsRecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

    public ImageView priority;
    public TextView sts_open;
    public TextView sts_overdue;
    public TextView tkt_from;
    public TextView tkt_subject;
    public TextView tkt_assignedto;
    public TextView tkt_created_date;
    public TextView txt_ticket_id;

    private SparseBooleanArray selectedItems = new SparseBooleanArray();

    public TicketsRecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        priority = (ImageView) itemView.findViewById(R.id.priority_status_icon);
        sts_open= (TextView) itemView.findViewById(R.id.tv_Tk_opn_status);
        sts_overdue = (TextView) itemView.findViewById(R.id.tv_Tk_overdue);
        tkt_from = (TextView) itemView.findViewById(R.id.tv_Tk_from);
        tkt_subject = (TextView) itemView.findViewById(R.id.tv_Tk_subject);
        tkt_assignedto = (TextView) itemView.findViewById(R.id.tv_Tk_Assignedto);
        tkt_created_date = (TextView) itemView.findViewById(R.id.tv_Tk_Created_date);
        txt_ticket_id …
Run Code Online (Sandbox Code Playgroud)

java android android-viewholder android-recyclerview

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

在viewholder中查看不更新(不占用高度)

我有一个配置为的视图wrap_content.在该视图中,如果用户未登录,我会显示一个视图.此视图被夸大为ViewStub.

在屏幕上的第一个单元格中,一切都很好.但是,如果我滚动到屏幕外的单元格,那就错了.这个观点没有达到他的高度.

在第三个单元格android:id="@+id/background"View_NoLoggedInView(那个中的那个ViewStub)没有达到他的高度.

我删除了不相关的代码,使类和布局更具可读性.

有谁知道为什么第三个细胞只有在他离开屏幕然后再次进入时才会更新,我怎么能解决这个问题?

在这里你可以找到像gif一样的视觉问题:

在此输入图像描述

Viewholder AXML布局:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/flickrList_red">
    <ViewStub
        android:id="@+id/noLoggedInViewInclude"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout="@layout/View_NoLoggedInView" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

膨胀的View_NoLoggedInView viewstub布局Axml代码:

    <?xml version="1.0" encoding="utf-8"?>
<Kvo.Droid.View_NoLoggedInView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true">
    <View
        android:id="@+id/background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0.75"
        android:background="@android:color/black" />
    <RelativeLayout
        android:id="@+id/whiteCard"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:background="@drawable/whitecard">
        <ImageView
            android:id="@+id/lockIcon"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:scaleType="centerInside"
            android:layout_centerVertical="true"
            android:layout_marginLeft="20dp"
            android:src="@mipmap/lock" />
        <MobileFans.Base.Droid.BaseTextView
            android:id="@+id/contentText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="20dp" …
Run Code Online (Sandbox Code Playgroud)

android viewstub android-layout android-viewholder

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

RecyclerView一次为所有项目创建ViewHolders

我有主要的RecyclerView,其中包含其他RecyclerViews(我们称之为subRecyclerViews).subRecyclerViews的数量基于从服务器接收的数据.问题是,每当subRecyclerView即将变为可见时,它会立即为其所有项创建ViewHolders(而不是仅为可见项创建ViewHolders).

在我调用的MainRecyclerViewAdapter onBindViewHolder()方法中

subRecyclerViewAdapter.setData(data);
subRecyclerView.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

这导致延迟,因为subRecyclerView为其所有项调用onCreateViewHolder()和onBindViewHolder()方法.

我使用的RecyclerView版本是

com.android.support:recyclerview-v7:25.1.1
Run Code Online (Sandbox Code Playgroud)

问题是,有没有办法告诉subRecyclerView它不需要为尚未可见的项创建ViewHolders?此外,这是RecyclerView中的错误还是我做错了什么?

android android-viewholder android-recyclerview

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

Android - Recycler View在EditText上单击错误的Holder

我有一个Recycler View来显示数据列表,并在Recycler View中编辑文本以允许用户编辑一些数字.

当键盘显示/隐藏时,我的应用程序也会调整活动大小.

该应用程序运行良好,除非我想编辑放在底部的项目.当我单击编辑文本时,它会调整屏幕大小,显示键盘,焦点持有者但错误的一个:通常是一个之前,有时是2个.

我试图跟踪问题,并了解LinearLayoutMnager的onFocusSearchFailed函数返回错误的视图.

知道为什么会这样吗?

适配器

private final LinearLayoutManager linearLayoutManager;
public Observable<double[][]> observable;
private ObservableEmitter<double[][]> observe;


List<Invoice> invoices = Collections.emptyList();
double[][] amounts;
Context context;

public AdjustInvoiceAdapter(List<Invoice> list, Context context, LinearLayoutManager linearLayoutManager) {
    this.invoices = list;
    this.context = context;
    this.linearLayoutManager = linearLayoutManager;

    amounts = new double[invoices.size()][1];
    for (int i = 0; i < list.size(); i++) {
        amounts[i][0] = invoices.get(i).getAmountDue();
    }
    observable = Observable.create(new ObservableOnSubscribe<double[][]> (){
        @Override
        public void subscribe(ObservableEmitter<double[][]> emitter) throws Exception {
            observe = emitter;
        }
    });
} …
Run Code Online (Sandbox Code Playgroud)

keyboard resize focus android-viewholder android-recyclerview

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

RecyclerView和java.lang.IndexOutOfBoundsException无效的视图持有者适配器positionViewHolder

我有一个RecyclerView可以捆绑杂货的物品。添加项目效果很好。但是,当我尝试删除项目时,应用程序崩溃了,并且出现了IndexOutOfBoundsException错误。

我面临的问题是我的onBindViewHolder()。我试图找到适配器的位置,但并没有解决问题。我也尝试过使用notifyDataSetChanged(),只是删除了我的整个列表。

我的问题是我做错了什么以及如何解决此问题?

这是Adapter类:

private class GroceryAdapter extends RecyclerView.Adapter<GroceryHolder>{
    private List<Grocery> groceries;
    private GroceryHolder holder;

    public GroceryAdapter(){
        setGroceries(GroceryList.get(GroceryActivity.this).getGroceries());
    }

    public void setGroceries(List<Grocery> groceries){
        this.groceries = groceries;
    }

    @Override
    public GroceryHolder onCreateViewHolder(ViewGroup parent, int viewType){
        LayoutInflater layoutInflater= LayoutInflater.from(GroceryActivity.this);
        View view=layoutInflater.inflate(R.layout.grocery_list_row, parent, false);
        holder =new GroceryHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final GroceryHolder holder, final int position){
        final Grocery grocery = groceries.get(position);
        holder.bindGrocery(grocery);
        //private Grocery grocery;
        holder.deleteImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View …
Run Code Online (Sandbox Code Playgroud)

java android indexoutofboundsexception android-viewholder android-recyclerview

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

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
查看次数