应用程序在API 19上的RecyclerView(适配器)上崩溃

时间:2016-04-20 21:31:21

标签: android android-recyclerview recycler-adapter

我正在尝试几乎整天,修复这个错误...但是logcat没有为我提供足够的信息来理解我做错了什么。在我的真实设备上运行API 23,我的recyclerview运行良好。一旦我在运行API 19的模拟器上运行应用程序,我的应用程序崩溃,当它开始加载recycleview的适配器。在运行Lollipop的模拟器上,这些问题不会持续存在。这是代码。

HistoryActivity

RecyclerView recyclerView1;
RecyclerView.Adapter rvadapter1;
RecyclerView.LayoutManager rvLayoutManager1;

public static ArrayList<String> itemAdress;
public static ArrayList<String> itemAuthor;
public static ArrayList<String> itemDate;

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


    Toolbar toolbar = (Toolbar) findViewById(R.id.rv_toolbar);
    setSupportActionBar(toolbar);
    toolbar.setTitle(R.string.title_recyclerview);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    itemAdress = new ArrayList<>();
    itemAuthor = new ArrayList<>();
    itemDate = new ArrayList<>();


    recyclerView1 = (RecyclerView) findViewById(R.id.recyclerView1);
    rvLayoutManager1 = new LinearLayoutManager(this);
    recyclerView1.setLayoutManager(rvLayoutManager1);
    recyclerView1.setHasFixedSize(true);

    rvadapter1 = new RVAdapter();
    recyclerView1.setAdapter(rvadapter1);

}

RVAdapter

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolderKlasse> {

public class ViewHolderKlasse extends RecyclerView.ViewHolder{

    TextView itemAdress;
    TextView itemAuthor;
    TextView itemDate;

    public ViewHolderKlasse(View itemView) {
        super(itemView);
        itemAdress = (TextView) itemView.findViewById(R.id.itemAdress);
        itemAuthor = (TextView) itemView.findViewById(R.id.itemAuthor);
        itemDate = (TextView) itemView.findViewById(R.id.itemDate);

    }
}

 @Override
public ViewHolderKlasse onCreateViewHolder(ViewGroup viewGroup, int i) {


    View itemView1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_rv, null);

    return new ViewHolderKlasse(itemView1);
}

@Override
public void onBindViewHolder(final ViewHolderKlasse viewHolderKlasse, final int i) {

    viewHolderKlasse.itemAdress.setText(HistoryActivity.itemAdress.get(i));
    viewHolderKlasse.itemAuthor.setText(HistoryActivity.itemAuthor.get(i));
    viewHolderKlasse.itemDate.setText(HistoryActivity.itemDate.get(i));

}

@Override
public int getItemCount() {

    return HistoryActivity.itemAdress.size();
}
}

这就是我在logcat中看到的

FATAL EXCEPTION: main
Process: support.plus.test, PID: 3640 java.lang.VerifyError:     support/plus/test/rv/RVAdapter at     support.plus.test.rv.HistoryActivity.onCreate(HistoryActivity.java:82)

第82行是:

        rvadapter1 = new RVAdapter();

欢迎任何帮助或想法!提前谢谢。

2 个答案:

答案 0 :(得分:2)

因此,VerifyError检查3件事:

  • 分支指向有效位置。
  • 数据已初始化且引用类型安全。
  • 可以控制对私有或包私有数据和方法的访问。

同样在你的情况下,你从适配器中访问Activity本身已经是设计中的错误,会产生太多的依赖。使用您需要的信息为适配器创建构造函数:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolderKlasse> {
    ArrayList<String> mItemAdress;
    ArrayList<String> mItemAuthor;
    ArrayList<String> mItemDate;
    public RVAdapter(ArrayList<String> itemAdress, ArrayList<String> itemAuthor, ArrayList<String> itemDate){
        mItemAdess = itemAdress;
        mItemAuthor = itemAuthor;
        mItemDate = itemDate;
    }
    ...
}

在适配器中使用这些数组,而不是通过空构造函数创建适配器,通过这个新的构造函数创建它。

答案 1 :(得分:-1)

我发现了问题,那就是杀了我......

当我将 此行添加到app build.gradle

multiDexEnabled true

Android API 19(KitKat)上的应用崩溃。

我在依赖项中另外添加了这个:

compile 'com.android.support:multidex:1.0.1'

这在Manifest中

android:name="android.support.multidex.MultiDexApplication"

并使用gradle文件同步项目,我的应用程序像魅力一样运行,并且它会停止崩溃。

无论如何,谢谢你们!