0

我正在使用RecyclerView在Fragment中以ImageViews和TextViews的形式顯示信息。我給了ImageViews一個OnClickListener來獲取位置,並用這個可繪製的ID在更大的ImageView中顯示圖像。這對在片段開頭處顯示的所有RecyclerView行都適用,但是隻要我點擊一行ImageView,我需要滾動到的位置,就會得到一個NullPointerException與按摩:RecyclerView OnClick導致NullPointerException

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 

顯示的信息根據預覽片段中的微調器而變化。該變量通過使用fragmentManager.region(d)的Activity被賦予Fragment。

的infromationFragment的代碼爲follwed:

public class Info_Material extends Fragment implements View.OnClickListener { 

Button button_back; 
Communicator communicator; 
static ImageView image_large; 


static private RecyclerView recyclerView; 
private Information_List_Adapter adapter; 

static ArrayList<String> holz_; 
static ArrayList<String> land_; 
static ArrayList<Integer> blatt_; 
static ArrayList<Integer> baum_; 
static ArrayList<Integer> frucht_; 

String region_; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_info_material, container, false); 

    holz_ = new ArrayList<>(); 
    land_ = new ArrayList<>(); 
    blatt_ = new ArrayList<>(); 
    baum_ = new ArrayList<>(); 
    frucht_ = new ArrayList<>(); 

    holz_.add(getString(R.string.)); 
    land_.add(""); 
    blatt_.add(R.drawable.); 
    baum_.add(R.drawable.); 
    frucht_.add(R.drawable.); 

    if (region_wahl.equals(getString(a))){ 
     holz_.addAll(Arrays.asList()); 
     land_.addAll(Arrays.asList()); 
     blatt_.addAll(Arrays.asList()); 
     baum_.addAll(Arrays.asList()); 
     frucht_.addAll(Arrays.asList()); 
    } 
    if (region_wahl.equals(getString(b))){ 
     holz_.addAll(Arrays.asList()); 
     land_.addAll(Arrays.asList()); 
     blatt_.addAll(Arrays.asList()); 
     baum_.addAll(Arrays.asList()); 
     frucht_.addAll(Arrays.asList()); 
    } 

    recyclerView= (RecyclerView) view.findViewById(R.id.materialInfoList); 
    adapter = new Information_List_Adapter(getActivity(),getData()); 
    recyclerView.setAdapter(adapter); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    button_back = (Button) view.findViewById(R.id.back_I_M); 
    button_back.setOnClickListener(this); 

    image_large= (ImageView) view.findViewById(R.id.image_large); 
    image_large.setOnClickListener(this); 

    return view; 
} 

public static List<Information_List> getData() { 
    List<Information_List> data = new ArrayList<>(); 

    for(int i=0;i<holz_.size() && i<blatt_.size() && i<baum_.size() && i<frucht_.size();i++) { 
     Information_List current = new Information_List(); 
     current.blattID=blatt_.get(i); 
     current.baumID=baum_.get(i); 
     current.fruchtID=frucht_.get(i); 
     current.holz=holz_.get(i); 
     data.add(current); 
    } 
    return data; 
} 



@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

} 

public void setCommunicator (Communicator communicator) { 
    this.communicator = communicator; 
} 

@Override 
public void onClick(View view) { 
    if(view.getId()==R.id.back_I_M){ 
     String d; 
     d = "back"; 
     communicator.finish_I_M(d); 
    } 
    if(view.getId()==R.id.image_large){ 
     image_large.setImageDrawable(null); 
    } 
} 


public void region (String d) { 

    region_ = d; 

} 

static void enlarge (int position,String data){ 
    ImageView imageView=null; 
    if(data.equals("blatt")){ 
     imageView = (ImageView)recyclerView.getChildAt(position).findViewById(R.id.info_list_blatt); 
    } 
    if(data.equals("baum")){ 
     imageView = (ImageView)recyclerView.getChildAt(position).findViewById(R.id.info_list_baum); 
    } 
    if(data.equals("frucht")){ 
     imageView = (ImageView)recyclerView.getChildAt(position).findViewById(R.id.info_list_frucht); 
    } 

    BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 

    image_large.setImageDrawable(drawable); 
} 

public interface Communicator { 

    void finish_I_M (String data); 

} 

}

的AdapterClass:

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

private Context context; 
private LayoutInflater inflater; 
List<Information_List> data = Collections.emptyList(); 

public Information_List_Adapter(Context context, List<Information_List> data) { 
    this.context=context; 
    inflater= LayoutInflater.from(context); 
    this.data=data; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate (R.layout.custom_info_material_row,parent,false); 
    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

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

    holder.holz.setText(Info_Material.holz_.get(position)); 
    holder.land.setText(Info_Material.land_.get(position)); 
    holder.blattID.setImageResource(Info_Material.blatt_.get(position)); 
    holder.baumID.setImageResource(Info_Material.baum_.get(position)); 
    holder.fruchtID.setImageResource(Info_Material.frucht_.get(position)); 

} 

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

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    TextView holz; 
    TextView land; 
    ImageView blattID; 
    ImageView baumID; 
    ImageView fruchtID; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     holz= (TextView) itemView.findViewById(R.id.info_list_holz); 
     land = (TextView) itemView.findViewById(R.id.info_list_land); 
     blattID = (ImageView) itemView.findViewById(R.id.info_list_blatt); 
     baumID = (ImageView) itemView.findViewById(R.id.info_list_baum); 
     fruchtID = (ImageView) itemView.findViewById(R.id.info_list_frucht); 

     blattID.setOnClickListener(this); 
     baumID.setOnClickListener(this); 
     fruchtID.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId()==R.id.info_list_blatt){ 
      Info_Material.enlarge(getAdapterPosition(),"blatt"); 
     } 
     if(v.getId()==R.id.info_list_baum){ 
      Info_Material.enlarge(getAdapterPosition(),"baum"); 
     } 
     if(v.getId()==R.id.info_list_frucht){ 
      Info_Material.enlarge(getAdapterPosition(),"frucht"); 
     } 
    } 
} 

}

如上所述,這種方法工作正常的所有初始創建行,當啓動片段,但儘快,作爲一個新創建的行(不是最初顯示在屏幕上)點擊應用程序崩潰與NullPointerException。

因爲我對Java編程還很陌生,所以我真的不知道從哪裏可以開始尋找錯誤,所以我很感激任何有關錯誤發生的提示。

在此先感謝。

+0

請向我們顯示它的錯誤行 – tyczj

回答

0

在您的enlarge方法中,您試圖在空引用上調用findViewById

此代碼:

(ImageView)recyclerView.getChildAt(position) 

,所以你不能用它findViewById被返回null。

也看到了這個問題:What is a NullPointerException, and how do I fix it?

最後一點,你會發現它無限地管理您的數據陣列移動到適配器,而不是從適配器回到你的片段,你需要一些數據,每次打電話的。

0

試試這個,

​​
0

這是更好地處理這一切適配器。使recyclerview靜態不是很好的解決方案。也許你想在其他地方使用片段或活動。

由於recyclerview回收視圖並只綁定對用戶可見的視圖,所以最好更改列表數據並通知適配器某些視圖已更改。

How to update RecyclerView Adapter Data?

這在你身邊有錯構。您必須將行數據存儲在「列表< Information_List>數據」中,並且不要使用片段中的那些數組列表:(holz_ land_ blatt_ baum_ frucht_)

相關問題