Android Recyclerview项目未显示

时间:2017-03-11 07:26:45

标签: android android-recyclerview recycler-adapter

我的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;
}

0 个答案:

没有答案