2015-09-23 3 views
-1

Как бы я мог использовать код в функции так же. Что мешает мне вызвать мой просмотр ресайклера из функции? Это ошибка, которую я получаю.Recycler Просмотр вызова из функции breaks

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference 

Функция, которая дает ошибку.

void PopulateList(View view) 
{ 

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

mRecyclerView.setHasFixedSize(true); 

final LinearLayoutManager mLayoutManager = new LinearLayoutManager(this); 
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
//mLayoutManager.isSmoothScrollbarEnabled(); 
mRecyclerView.setLayoutManager(mLayoutManager); 

mAdapter = new RecyclerViewAdapter(EventsData); 
mRecyclerView.setAdapter(mAdapter); 
} 

RecyclerViewAdapter Класс

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.content.Context; 

import com.squareup.picasso.MemoryPolicy; 
import com.squareup.picasso.NetworkPolicy; 
import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 

import jp.wasabeef.picasso.transformations.CropCircleTransformation; 

/** 
* Created by on 9/23/2015. 
*/ 
public class RecyclerViewAdapter extends   RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
private ArrayList<EventsListData> EventsData; 
Context context; 

public static class ViewHolder extends RecyclerView.ViewHolder 
{ 
    public View view; 
    public ViewHolder(View v) 
    { 
     super(v); 
     view = v; 
    } 
} 

public RecyclerViewAdapter(ArrayList<EventsListData> EventsData) 
{this.EventsData = EventsData;} 



@Override 
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    //ceate a new view 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.events_list_layout, parent, false); 

    //set the view's size, margins, padding and layout paremters; 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

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

    // - get elements from your dataset at this position 
    // - replace the contenst of the view with that elements 

} 

    public void setData(int Maxposition) 
{ 

    int position=0; 
    TextView txtDisc = (TextView) vh.view.findViewById(R.id.EventDisc); 
    TextView txtDistance = (TextView) vh.view.findViewById(R.id.EventsDistance); 
    FrameLayout Frame = (FrameLayout) vh.view.findViewById(R.id.EventsFrame); 
    ImageView imgView = (ImageView) vh.view.findViewById(R.id.EventsImageView); 

    for (int i = 0 ; i <Maxposition ; i++) { 
     Picasso.with(this.context).load("file://" + EventsData.get(position).art_work_uri) 
       .memoryPolicy(MemoryPolicy.NO_CACHE) 
       .networkPolicy(NetworkPolicy.NO_CACHE) 
       .centerInside() 
       .transform(new CropCircleTransformation()) 
         //.resize(200, 200) 
       .into(imgView); 

     txtDisc.setText(EventsData.get(position).description); 
     txtDistance.setText(Float.toString(EventsData.get(position).Distance) + " KM"); 

     Frame.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       Log.d("XXX","RecyclerView position ="); 
      } 
     }); 
    } 
    position++; 
} 

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

Шаблоны, используемые вместе с адаптером.

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.3"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="0.30" 
     android:id="@+id/Frame"> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.98" 
      android:id="@+id/EventsFrame"> 

      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

       <LinearLayout 
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight="0.5" 
        android:paddingLeft="15dp" 
        android:paddingRight="15dp"> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:textAppearance="?android:attr/textAppearanceLarge" 
         android:id="@+id/EventDisc" 
         android:layout_gravity="center_vertical" 
         android:text="random test text" /> 
       </LinearLayout> 

       <LinearLayout 
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight="0.5" 
        android:paddingLeft="15dp"> 

        <ImageView 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:id="@+id/EventsBlip" 
         android:layout_gravity="center_vertical" 
         android:layout_weight="0.1" 
         android:src="@drawable/point" /> 

        <TextView 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:textAppearance="?android:attr/textAppearanceMedium" 
         android:text="KM" 
         android:id="@+id/EventsDistance" 
         android:layout_gravity="center_vertical" 
         android:layout_weight="0.9" 
         android:paddingLeft="10dp" 
         android:layout_marginRight="15dp" /> 

       </LinearLayout> 

      </LinearLayout> 
     </FrameLayout> 

     <FrameLayout 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="0.02" 
      android:background="#888888"> 

     </FrameLayout> 

    </LinearLayout> 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/EventsImageView" /> 
</FrameLayout> 

LogCat с просьбой ...

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference 
     at android.support.v7.widget.RecyclerView.computeVerticalScrollRange(RecyclerView.java:1545) 
     at android.view.View.onDrawScrollBars(View.java:12866) 
     at android.view.View.draw(View.java:15154) 
     at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3037) 
     at android.view.View.updateDisplayListIfDirty(View.java:14082) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.updateDisplayListIfDirty(View.java:14077) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.updateDisplayListIfDirty(View.java:14077) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.updateDisplayListIfDirty(View.java:14077) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.updateDisplayListIfDirty(View.java:14077) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.updateDisplayListIfDirty(View.java:14077) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.View.draw(View.java:14872) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3404) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) 
     at android.view.View.draw(View.java:15151) 
     at android.widget.FrameLayout.draw(FrameLayout.java:592) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2657) 
     at android.view.View.updateDisplayListIfDirty(View.java:14082) 
     at android.view.View.getDisplayList(View.java:14105) 
     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:266) 
     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:272) 
     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:311) 
     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2528) 
     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2366) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1997) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5845) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5274) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 

ОБРАТИТЕ ВНИМАНИЕ! Я заметил, что если я прокомментирую все, что связано с RecyclerView, это все еще происходит. Поэтому я прокомментировал это в XML-макете и он работает.

< android.support.v7.widget.RecyclerView 
     android:id="@+id/my_recycler_view" 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
/> 

SO Я добавил функцию в свой класс RecyclerViewAdapter, но не совсем уверен, что она будет работать. Потому что я просто не могу назвать его из своего Объекта, и я не могу понять, почему? Поэтому я не могу понять, будет ли это работать. Почему я не могу назвать это?

public void setData(int Maxposition) 
{ 

    int position=0; 
    TextView txtDisc = (TextView) vh.view.findViewById(R.id.EventDisc); 
    TextView txtDistance = (TextView) vh.view.findViewById(R.id.EventsDistance); 
    FrameLayout Frame = (FrameLayout) vh.view.findViewById(R.id.EventsFrame); 
    ImageView imgView = (ImageView) vh.view.findViewById(R.id.EventsImageView); 

    for (int i = 0 ; i <Maxposition ; i++) { 
     Picasso.with(this.context).load("file://" + EventsData.get(position).art_work_uri) 
       .memoryPolicy(MemoryPolicy.NO_CACHE) 
       .networkPolicy(NetworkPolicy.NO_CACHE) 
       .centerInside() 
       .transform(new CropCircleTransformation()) 
         //.resize(200, 200) 
       .into(imgView); 

     txtDisc.setText(EventsData.get(position).description); 
     txtDistance.setText(Float.toString(EventsData.get(position).Distance) + " KM"); 

     Frame.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       Log.d("XXX","RecyclerView position ="); 
      } 
     }); 
    } 
    position++; 
} 
+0

опубликуйте полный код и лог-код, чтобы быть более четким. – Aakash

ответ

0

кажется вы называете PopulateList слишком поздно (или не совсем). Убедитесь, что он вызван как можно скорее после создания представления, поэтому, если вы используете Activity, тогда PopulateList() должен быть вызван в onCreate, если вы используете фрагмент, его необходимо вызвать в onCreateView.

Вам не нужно сразу устанавливать адаптер/данные, но вы должны установить установить менеджер компоновки до RecyclerView.

+0

Хорошо, что имеет смысл, но проблема, с которой я сталкиваюсь сейчас, - это данные, которые еще не готовы к показу? В некоторых случаях может потребоваться довольно много времени, чтобы получить все данные из источников, а затем упаковать их в объект, который будет отображаться. Вся сборка ресурсов выполняется асинхронно, поэтому, если я хочу добавить функцию в onCreate, она будет запущена, прежде чем все будет хорошо. – Testo

+0

Также вчера я заметил, что если я прокомментирую все, что связано с RecyclerView, это все равно происходит. Поэтому я прокомментировал это в XML-макете и он работает. Testo

+1

Вы можете создать метод 'setData' в вашем адаптере и динамически обновлять данные. Таким образом, вы должны: немедленно настроить «RecyclerView» с помощью «LayoutManger»; Настройте адаптер и удерживайте его в поле; Когда у вас есть данные, вы вызываете 'adapter.setData (yourData)'; В методе 'setData' адаптера вы устанавливаете список и вызываете' notifyDataSetChanged() ' – wasyl

Смежные вопросы