Android 无法设置回收器视图

Android 无法设置回收器视图,android,android-recyclerview,Android,Android Recyclerview,我一直在使用ListView,现在正在试用Recycler视图。我一直试图按照基本设置的文档进行操作,但令人沮丧的是无法做到这一点 ViewHolder类应该接受一个TextView参数,但在文档站点中,示例是输入一个视图作为参数,我不知道该如何工作。我试图用TextView强制转换它,得到一个ClassCastException。我已经在上面的一行中进行了注释,它给出了阻止我编译的错误。错误在MyAdapter类中 我很抱歉,如果我只是不善于阅读文件,否则这显然是荒谬的来自一个官方网站 主要活

我一直在使用ListView,现在正在试用Recycler视图。我一直试图按照基本设置的文档进行操作,但令人沮丧的是无法做到这一点

ViewHolder类应该接受一个TextView参数,但在文档站点中,示例是输入一个视图作为参数,我不知道该如何工作。我试图用TextView强制转换它,得到一个ClassCastException。我已经在上面的一行中进行了注释,它给出了阻止我编译的错误。错误在MyAdapter类中

我很抱歉,如果我只是不善于阅读文件,否则这显然是荒谬的来自一个官方网站

主要活动

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        String[] myDataset = {"item 1", "item 2"};

        mAdapter = new MyAdapter(myDataset);
        mRecyclerView.setAdapter(mAdapter);
    }
}
MyAdapter类

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private String[] mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_text_view, parent, false);

        //THIS is the line causing error. v is View. I should be inputting a textview. 
        ViewHolder vh = new ViewHolder(v);

        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }

}
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
公共类MyAdapter扩展了RecyclerView.Adapter{
私有字符串[]mDataset;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图mTextView;
公共视图持有者(文本视图v){
超级(五);
mTextView=v;
}
}
公共MyAdapter(字符串[]myDataset){
mDataset=myDataset;
}
@凌驾
public MyAdapter.ViewHolder onCreateViewHolder(视图组父级,
int视图类型){
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.my_text_视图,父视图,false);
//这是导致错误的行。v是视图。我应该输入文本视图。
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
holder.mTextView.setText(mDataset[position]);
}
@凌驾
public int getItemCount(){
返回mDataset.length;
}
}
我的文本视图xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textView" />
</LinearLayout>

您的取景器必须如下所示:

public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView mTextView;
    public ViewHolder(View v) {
        super(v);
        mTextView = v.findViewById(R.id.textViewId);
    }
}

别忘了将android:id=“@+id/textViewId”放在布局中的文本视图中

您将从充气机中获得一个
线性布局

View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_text_view, parent, false);
// v <- LinearLayout
  • 调整您的ViewHolder以接受视图或线性布局

    public ViewHolder(View v) {
      mTextView = (TextView) v.findViewById(R.id.text);
    }
    

  • 您可以执行以下操作之一。或者将
    ViewHolder
    类的构造函数更改为参数a
    View
    ,如下所示

    public static class ViewHolder extends RecyclerView.ViewHolder {
            TextView mTextView;
    
            public ViewHolder(View v) {
                super(v);
            }
    }
    
       @Override
        public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.site_item, parent, false);
            // set the view's size, margins, paddings and layout parameters
    
            ViewHolder vh = new ViewHolder(v);
            vh.name = (TextView) v.findViewById(R.id.textView);
    
            return vh;
        }
    
    @Override
    public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.site_item, parent, false);
    
        TextView mTextView = (TextView) v.findViewById(R.id.textview);
    
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(mTextView);
    
        return vh;
    }
    
    然后像这样更改
    onCreateViewHolder
    方法

    public static class ViewHolder extends RecyclerView.ViewHolder {
            TextView mTextView;
    
            public ViewHolder(View v) {
                super(v);
            }
    }
    
       @Override
        public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.site_item, parent, false);
            // set the view's size, margins, paddings and layout parameters
    
            ViewHolder vh = new ViewHolder(v);
            vh.name = (TextView) v.findViewById(R.id.textView);
    
            return vh;
        }
    
    @Override
    public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.site_item, parent, false);
    
        TextView mTextView = (TextView) v.findViewById(R.id.textview);
    
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(mTextView);
    
        return vh;
    }
    
    或者您可以保留构造函数,并像这样更改
    onCreateViewHolder
    方法

    public static class ViewHolder extends RecyclerView.ViewHolder {
            TextView mTextView;
    
            public ViewHolder(View v) {
                super(v);
            }
    }
    
       @Override
        public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.site_item, parent, false);
            // set the view's size, margins, paddings and layout parameters
    
            ViewHolder vh = new ViewHolder(v);
            vh.name = (TextView) v.findViewById(R.id.textView);
    
            return vh;
        }
    
    @Override
    public MemebershipAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.site_item, parent, false);
    
        TextView mTextView = (TextView) v.findViewById(R.id.textview);
    
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(mTextView);
    
        return vh;
    }
    

    因此,请输入
    TextView
    。请提供
    R.layout.my\u text\u view
    -我假设它看起来像
    。从textview中删除包装布局,它应该可以工作。@DavidMedenjak如果我放入textview,那么如何传入视图v?添加了xmlA
    TextView扩展视图
    View
    是它的超类,您可以在它的位置使用
    TextView
    。请提供前面提到的布局xml。删除linearlayout,将名称空间添加到textview,它应该work@DavidMedenjak对不起,我不明白。我理解观点是超级阶级。但我必须通过那个充气机。你的意思是不是说视图v=布局更平坦。。。使用文本视图v=LayoutInflater。。。如果没有,请给我举个例子。我将删除线性。使用选项2。作品谢谢