2017-04-15 7 views
0

私はカスタムビューア内でnullpointerエラーを受け取りますが、リストビューを埋めるために作成しましたが、その下にキャプションを持つ要素イメージとして保持するネストされたフラグメントでリストビューを作成しようとしています。 。ここでのコードは次のとおりです。ネストされたフラグメントにカスタムアダプタを実装する方法

カスタムアダプタ:

import android.app.Activity; 
import android.view.View; 
     import android.content.Context; 
     import android.view.LayoutInflater; 
     import android.view.View; 
     import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
     import android.widget.ImageView; 
     import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class ImageAdapter extends ArrayAdapter<Image> { 

    ArrayList<Image> imageList; 
    private Context mContext; 
    int resource; 

    public ImageAdapter(Context context, int resource, ArrayList<Image> imageObjects) { 
     super(context, resource, imageObjects); 
     this.imageList = imageObjects; 
     this.mContext = context; 
     this.resource = resource; 
    } 

    public ArrayList<Image> getImageList() { 
     return imageList; 
    } 

    public void setImageList(ArrayList<Image> imageList) { 
     this.imageList = imageList; 
    } 

    public Context getmContext() { 
     return mContext; 
    } 

    public void setmContext(Context mContext) { 
     this.mContext = mContext; 
    } 

    public int getResource() { 
     return resource; 
    } 

    public void setResource(int resource) { 
     this.resource = resource; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 

     if(convertView==null){ 
      LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.fragment_membership, null, true); 

     } 

     Image image = getItem(position); 

     ImageView layoutImage = (ImageView)convertView.findViewById(R.id.membershipimage); 
     layoutImage.setImageResource(image.getImageResourceID()); 
     TextView layoutText = (TextView)convertView.findViewById(R.id.membershipCaption); 
     layoutText.setText(image.getImageCaption()); 

     return super.getView(position, convertView, parent); 
    } 
} 

私が使用してフラグメント、別のフラグメント内:

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.GridView; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MembershipFragment extends Fragment { 

    ArrayList<Image> imageList; 
    ListView membershipListView; 

    public static MembershipFragment newInstance() { 
     MembershipFragment fragment = new MembershipFragment(); 
     return fragment; 
    } 

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

    } 



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

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     imageList = new ArrayList<>(); 
     for(int i=0; i<3; i++){ 
      Image image = new Image(R.drawable.cinnamon_apple_breakfast, "Test Caption"); 
      imageList.add(image); 
     } 
     membershipListView = (ListView)view.findViewById(R.id.membershipListView); 
     try{ 
      ImageAdapter adapter = new ImageAdapter(getContext(), R.layout.list_view_item, imageList); 
      membershipListView.setAdapter(adapter); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

アプリはカスタムアダプタでnullポインタ例外をスロー、起動時にクラッシュしgetViewメソッドで、イメージ・リソースIDをイメージ・ビューに設定しようとしました。問題はどこだ?

+0

はなぜsetAdapter上のtry catchが、私はあなたがフラグメントレイアウトのリストを保持するために、あなたのフラグメントのレイアウトをしたいとは思いませんか? –

答えて

0

あなたのレイアウトが混乱していると思います。

ここでgetActivityを使用してください。

ImageAdapter adapter = new ImageAdapter(getContext(), R.layout.list_view_item 

レイアウトリソースを渡しました。しかし、アダプタの内部では、別のレイアウトを使用しています。

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 

    if(convertView==null){ 
     LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.fragment_membership, null, true); 

    } 

あなたはgetResourceメソッドを作成しました。理由はありますか?あなたは決してそれを呼びません。

(再帰ので)

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

    return view; 
} 
+0

getresourceメソッドは、私がこれ以上の実装と作業を行うために必要なものです。私は下部のナビゲーションバーが実装されているので、ネストされたフラグメントを使用する必要があります。フラグメントの1つにさらにフラグメントを含むtablayoutが含まれています。 ArrayAdapterはリソースIDがTextViewであることを要求します – Igor

+0

私はそのエラーをどこで取得するのか分かりませんが、そのメッセージを検索すると、そのメッセージに対する回答が存在することがわかります。そして、私はタブレイアウトでネストされたフラグメントにコメントしませんでした。私が指摘していたのは、 'R.layout.list_view_item'は一度も使用されていなかったため、あなたのアダプタはImageViewとTextViewを見つけることができませんでした –

関連する問題