我的RecyclerView
对象有点问题。
在我的主要活动中,我有一个列表,我想显示特定的对象。
首先,我为列表创建一个合适的适配器,然后将其附加到RecyclerView
,就像它应该的那样。
我的问题出于某种原因,列表没有显示任何内容。 RecyclerView
我使用的RecyclerView
类型是一个自定义列表,它从ImageView
类扩展而来,用于在列表为空时显示package com.silverfix.dgdeditor;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.design.internal.NavigationMenuView;
import android.support.design.widget.NavigationView;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.silverfix.dgdeditor.adapters.DocumentsAdapter;
import com.silverfix.dgdeditor.utils.DocumentPack;
import com.silverfix.dgdeditor.utils.files.json.JsonPackReader;
import com.silverfix.dgdeditor.utils.views.AnimationUtils;
import com.silverfix.dgdeditor.utils.views.DividerItemDecoration;
import com.silverfix.dgdeditor.utils.views.EmptyViewRecyclerView;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.recyclerview.animators.ScaleInAnimator;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
private JsonPackReader jsonReader;
private EmptyViewRecyclerView documentsRv;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle actionBarDrawerToggle;
private Toolbar toolbar;
private DocumentsAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.app_name) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
drawerLayout.addDrawerListener(actionBarDrawerToggle);
// Setting the actionbarToggle to drawer layout
actionBarDrawerToggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.nav_item_divider, getTheme());
for(int i = 1; i < navigationView.getChildCount(); i++) {
NavigationMenuView itemView = (NavigationMenuView) navigationView.getChildAt(i);
itemView.addItemDecoration(new DividerItemDecoration(drawable));
}
ImageView emptyView = (ImageView) findViewById(R.id.empty_view);
emptyView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
launchCreateActivity();
}
});
AnimationUtils.fadeView(emptyView);
documentsRv = (EmptyViewRecyclerView) findViewById(R.id.documents_rv);
// Setting linear layout manager for the list
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
documentsRv.setLayoutManager(linearLayoutManager);
documentsRv.setEmptyView(emptyView);
documentsRv.setItemAnimator(new ScaleInAnimator());
documentsRv.getItemAnimator().setAddDuration(Constants.Extras.ITEM_ANIMATION_DURATION);
documentsRv.getItemAnimator().setRemoveDuration(Constants.Extras.ITEM_ANIMATION_DURATION);
documentsRv.getItemAnimator().setMoveDuration(Constants.Extras.ITEM_ANIMATION_DURATION);
documentsRv.getItemAnimator().setChangeDuration(Constants.Extras.ITEM_ANIMATION_DURATION);
jsonReader = new JsonPackReader(this);
List<DocumentPack> packsList = new ArrayList<>();
try {
packsList = jsonReader.fetchPacksFromJsonFile();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Error: data not synchronized", Toast.LENGTH_SHORT).show();
} finally {
adapter = new DocumentsAdapter(packsList);
adapter.setMenuInflater(getMenuInflater());
}
documentsRv.setAdapter(adapter);
}
private void launchCreateActivity() {
Intent intent = new Intent(MainActivity.this, NewDocActivity.class);
startActivity(intent);
}
@Override
protected void onResume() {
super.onResume();
System.out.println("Paused");
if(toolbar != null)
setSupportActionBar(toolbar);
}
@Override
protected void onPause() {
super.onPause();
System.out.println("Paused");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_action_bar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_create) {
launchCreateActivity();
} else if(actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return false;
}
}
。在这种情况下,当适配器附加到列表时,不会显示空图像,也不会显示列表的项目
以下是主要活动的代码:
DocumentsAdapter
以下是package com.silverfix.dgdeditor.adapters;
import android.support.v7.widget.RecyclerView;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.silverfix.dgdeditor.R;
import com.silverfix.dgdeditor.utils.DocumentPack;
import java.util.List;
/**
* Created by David on 08/03/2017.
*/
public class DocumentsAdapter extends ContextAdapter{
private List<DocumentPack> dataSet;
public DocumentsAdapter(List<DocumentPack> dataSet) {
super();
this.dataSet = dataSet;
}
@Override
public DocumentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.document_list_item, parent, false);
return new DocumentViewHolder(view, menuInflater);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
DocumentPack pack = dataSet.get(position);
DocumentViewHolder documentViewHolder = (DocumentViewHolder) holder;
documentViewHolder.bindData(pack);
documentViewHolder.bindClick(onClickListener);
documentViewHolder.bindLongClick(onLongClickListener);
}
@Override
public int getItemCount() {
return dataSet.size();
}
public static class DocumentViewHolder extends AbstractViewHolder implements View.OnCreateContextMenuListener {
private TextView documentName, documentDate;
public DocumentViewHolder(View rootView, MenuInflater inflater) {
super(rootView);
rootView.setOnCreateContextMenuListener(this);
this.inflater = inflater;
documentName = (TextView) rootView.findViewById(R.id.document_card_name_tv);
documentDate = (TextView) rootView.findViewById(R.id.document_card_date_tv);
}
@Override
public void bindData(Object object) {
DocumentPack pack = (DocumentPack) object;
documentName.setText(pack.getFileName());
documentDate.setText(pack.getDate());
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
}
}
}
类的代码:
package com.silverfix.dgdeditor.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.MenuInflater;
import android.view.ViewGroup;
import com.silverfix.dgdeditor.utils.views.RecyclerViewClickListener;
import com.silverfix.dgdeditor.utils.views.RecyclerViewLongClickListener;
import com.silverfix.javadgd.components.GoodObject;
import java.util.List;
/**
* Created by David on 09/03/2017.
*/
public abstract class ContextAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
protected int clickedItemPos;
protected RecyclerViewClickListener onClickListener;
protected RecyclerViewLongClickListener onLongClickListener;
protected MenuInflater menuInflater;
public ContextAdapter() {
clickedItemPos = -1;
}
public void setClickedItemPosition(int clickedItemPos) {
this.clickedItemPos = clickedItemPos;
}
public int getClickedItemPosition() {
return clickedItemPos;
}
public void setMenuInflater(MenuInflater menuInflater) {
this.menuInflater = menuInflater;
}
public void setClickListener(RecyclerViewClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public void setOnLongClickListener(RecyclerViewLongClickListener onLongClickListener) {
this.onLongClickListener = onLongClickListener;
}
}
ContextAdapter的代码:
// ConsoleApplication4.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include<iostream>
#include<chrono>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
class linked_list_node
{
int a;
public :
std::string var;
bool eval()
{
if (var == "abc")
return true;
return false;
}
linked_list_node() { a = rand() % 100; if (a % 2 == 0) var = "abc"; }
linked_list_node* nxt;
std::string getVar() { return var; }
linked_list_node* getNext()
{
return nxt;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
linked_list_node *head = new linked_list_node();
linked_list_node *trav = head;
int len = 75000;
while (len != 0)
{
linked_list_node *n = new linked_list_node();
trav->nxt = n;
trav = n;
len--;
}
trav->nxt = NULL;
//traversal with function
int length = 0;
trav = head;
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
while (trav != NULL)
{
length++;
if (trav->eval())
std::cout << "";
trav = trav->nxt;
}
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "Time difference with function == " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << std::endl;
//traversal without function
trav = head;
length = 0;
begin = std::chrono::steady_clock::now();
while (trav != NULL)
{
length++;
if (trav->var =="abc")
std::cout << "";
trav = trav->nxt;
}
end = std::chrono::steady_clock::now();
std::cout << "Time difference without function = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << std::endl;
getchar();
return 0;
}