RecyclerView:没有连接适配器;在活动

时间:2016-12-12 11:08:58

标签: java android android-recyclerview

我已经查看了其他问题,但没有一个答案适合我。

我在尝试给RecyclerView充气时遇到的错误是:

  

E / RecyclerView:没有连接适配器;跳过布局

这是我尝试向我的RecyclerView充气的ArrayList的一个Example-Item:

//Chord Obj: Chord(int images[], String name, Int sound) 

chords.add(new Chord(new int[]{
            R.drawable.do_maggiore, R.drawable.do_maggiore_alt1, R.drawable.do_maggiore_alt2,
            R.drawable.do_maggiore_alt3, R.drawable.do_maggiore_alt4, R.drawable.do_maggiore_alt5,
            R.drawable.do_maggiore_alt6}, Resources.getSystem().getString(R.string.c), R.raw.do_maggiore));

这是我的List_Adapter.java

public class List_adapter extends RecyclerView.Adapter<List_adapter.MyViewHolder> {
private ArrayList<Chord> list;
Context c;

public class MyViewHolder extends RecyclerView.ViewHolder {
    private TextView name;
    private ImageView image;

    private MyViewHolder(View v) {
        super(v);
        name = (TextView) v.findViewById(R.id.name);
        image = (ImageView) v.findViewById(R.id.chord_image);
    }
}

public List_adapter(Context c, ArrayList<Chord> list) {
    this.list = list;
    this.c = c;
}

@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_row, parent, false);

    return new MyViewHolder(itemView);
}

@Override public void onBindViewHolder(MyViewHolder holder, int pos) {
    Chord chord = list.get(pos);
    holder.name.setText(chord.getName());
    holder.image.setImageResource(chord.getImages()[0]);
}

@Override public int getItemCount() {return list.size();}
}

这是我获取列表并将其扩展到我的Main_Activity.onCreate()

的地方
 /* gets the list */
    chords = new ArrayList<>();
    ChordsList list = new ChordsList();
    list.createList();
    chords = list.getList();

    /* puts the list into the recyclerView */
    recyclerView = (RecyclerView) findViewById(R.id.chords_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(Main_list_activity.this,
            LinearLayoutManager.VERTICAL, false));
    recyclerView.setHasFixedSize(true);

    final List_adapter adapter = new List_adapter(this, chords);
    recyclerView.setAdapter(adapter);

最后,这是我的xml:

...
<android.support.v7.widget.RecyclerView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chords_recycler"
    android:layout_alignParentStart="true"
    android:layout_marginTop="25dp" />
...

这是我到目前为止所尝试的:

  • 检查RecyclerView是否以某种方式缩小或隐藏。它没有。
  • 在我的列表中添加和删除了多个元素。什么都没有改变。
  • 尝试首先将Recycler设置为空适配器。也没有运气。
  • 调试并检查扩充时列表是否为空。事实并非如此。

不知道我还能做些什么。我很感激一些帮助。

修改

我真的不知道它是否有用,但我在创建项目时使用了导航抽屉预设,并且我在我创建的类中添加了此代码,并将布局设置为R.layout.content_drawer

此外,在调试时我没有从调试器获得任何结果,这是一个Image:

debug_image

5 个答案:

答案 0 :(得分:1)

尝试将 RecyclerView 高度设为“match_parent”,然后查看输出是否有效。

答案 1 :(得分:1)

在设置适配器时使用以下内容: -

List_adapter adapter = new List_adapter(this, chords);
RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager1);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter); 

而不是

final List_adapter adapter = new List_adapter(this, chords);
recyclerView.setAdapter(adapter);

答案 2 :(得分:1)

它没有显示,因为您试图在 onCreate 方法中对RecyclerView进行充气。请将您的RecyclerView代码移至活动的 onResume 方法。

 /* gets the list */
    chords = new ArrayList<>();
    ChordsList list = new ChordsList();
    list.createList();
    chords = list.getList();

    /* puts the list into the recyclerView */
    recyclerView = (RecyclerView) findViewById(R.id.chords_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(Main_list_activity.this,
            LinearLayoutManager.VERTICAL, false));
    recyclerView.setHasFixedSize(true);

    final List_adapter adapter = new List_adapter(this, chords);
    recyclerView.setAdapter(adapter);

答案 3 :(得分:1)

在您的活动中插入以下内容:

public class TestActivity extends AppCompatActivity {
    RecyclerView recyclerView;
ArrayList<Chord> chords;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
        setAdapter();
    }
private void setAdapter() {
     chords = new ArrayList<>();

    chords.add(new Chord(new int[]{
            R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher,
            R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher,
            R.mipmap.ic_launcher},"Name", R.raw.audio_in_raw));


    List_adapter adapter = new List_adapter(chords, this);
    RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLayoutManager1);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

}

在适配器中添加以下内容:

public class List_adapter extends   RecyclerView.Adapter<List_adapter.MyViewHolder> {

private List<Chord> chord;
Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tvText;
    ImageView ivImage;
    public MyViewHolder(View view) {
        super(view);
        ivImage= (ImageView) view.findViewById(R.id.ivImage);

        tvText= (TextView) view.findViewById(R.id.tvText);
    }
}


public List_adapter(List<Chord> chord,  Context context) {
    this.chord = chord;
    this.context =  context;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.customadapter_chords, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {


    holder.tvText.setText(chord.get(position).getName());
    holder.ivImage.setImageResource(chord.get(position).getImages()[0]);

}

@Override
public int getItemCount() {
    return chord.size();
}

}

并在适配器中添加以下内容: -

public class Chord {
int images[];
String name;
int sound;

public Chord(int[] images, String name, int sound) {
    this.images = images;
    this.name = name;
    this.sound = sound;

}

public int[] getImages() {
    return images;
}

public void setImages(int[] images) {
    this.images = images;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getSound() {
    return sound;
}

public void setSound(int sound) {
    this.sound = sound;
}
}

和xml是

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

>
<ImageView
    android:layout_weight="2"
    android:id="@+id/ivImage"
    android:layout_width="0dp"
    android:layout_height="match_parent"></ImageView>

<TextView
    android:gravity="center"
    android:id="@+id/tvText"
    android:layout_weight="6"
    android:layout_width="0dp"
    android:layout_height="match_parent" />

答案 4 :(得分:0)

我设法解决了这个问题。实际上问题非常明显,但在撰写问题时我并没有完全理解它。

我只是创建了另一个活动,并将布局设置为content_drawer。这是错误的,因为所有代码都需要放在Drawer.class中(如果您在Android Studio中使用导航抽屉预设)。

这就是调试器没有显示任何内容的原因,因为它根本没有进入那个类。而且因为代码从未运行过,当然它无法显示任何内容。

感谢我得到的答案。