2017-03-06 15 views
0

どのように私のcustomAdapterに異なるスタイリングを与えるか?私のカスタムアダプターはgetViewメソッドからレイアウトビューを取得します。私がしたいのは、異なるアクティビティからアダプタが呼び出されたときに、異なるスタイリングレイアウトを与えることです。私はインターフェイスを使用しようとしましたが、それは示して、これは私のgetViewメソッド(int型の位置、表示convertView、のViewGroupの親)メソッド内で自分のコードをある1つのcustomAdapterに異なるスタイリングレイアウトを与える

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

エラー:

:私はインターフェイスを実装した後

if(convertView!=null){ 
    convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item1,parent,false); 
} 

クラスCustomAdapter内部

StylingView stylingView; 
public interface StylingView{ 
    void styleView(View convertView,ViewGroup parent); 
} 

public View getView(int position, View convertView, ViewGroup parent){ 
    stylingView.styleView(convertView,parent); 
} 

内部FragmentSecondPage.class

public class FragmentSecondPage extends ListFragment implements CustomAdapter.StylingView{ 
    CustomAdapter customAdapter; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     customAdapter.styleView = this; 
    } 
    @Override 
    public void styleView(View convertView,ViewGroup parent){ 
     if(convertView!=null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item1,parent,false); 
     } 
    } 
} 

この問題を解決するためにどのような方法、またはそうする他の方法はありますか?

答えて

0

getViewTypeCount() & getItemViewType(int position)を実装する必要があります。以下の例を見てください。

public class MultipleItemsList extends ListActivity { 

private MyCustomAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mAdapter = new MyCustomAdapter(); 
    for (int i = 1; i < 50; i++) { 
     mAdapter.addItem("item " + i); 
     if (i % 4 == 0) { 
      mAdapter.addSeparatorItem("separator " + i); 
     } 
    } 
    setListAdapter(mAdapter); 
} 

private class MyCustomAdapter extends BaseAdapter { 

    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_SEPARATOR = 1; 
    private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1; 

    private ArrayList mData = new ArrayList(); 
    private LayoutInflater mInflater; 

    private TreeSet mSeparatorsSet = new TreeSet(); 

    public MyCustomAdapter() { 
     mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final String item) { 
     mData.add(item); 
     notifyDataSetChanged(); 
    } 

    public void addSeparatorItem(final String item) { 
     mData.add(item); 
     // save separator position 
     mSeparatorsSet.add(mData.size() - 1); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return TYPE_MAX_COUNT; 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return mData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     int type = getItemViewType(position); 
     System.out.println("getView " + position + " " + convertView + " type = " + type); 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      switch (type) { 
       case TYPE_ITEM: 
        convertView = mInflater.inflate(R.layout.item1, null); 
        holder.textView = (TextView)convertView.findViewById(R.id.text); 
        break; 
       case TYPE_SEPARATOR: 
        convertView = mInflater.inflate(R.layout.item2, null); 
        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); 
        break; 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 
     holder.textView.setText(mData.get(position)); 
     return convertView; 
    } 

} 

public static class ViewHolder { 
    public TextView textView; 
} 
} 

ここで、getItemViewType()は独自のロジックです。アダプターのコンストラクター・パラメーターを介してフラグを設定してアクティビティーを識別し、それに応じてロジックを記述して対応するレイアウトを拡張することができます。

+0

ですが、さまざまなアクティビティに対してこれをどのように行うのですか? – VincentTheonardo

+0

Activity1から、 'mAdapter = new MyCustomAdapter(LAYOUT_TYPE1);を呼び出し、Activity2から' mAdapter = new MyCustomAdapter(LAYOUT_TYPE2); 'を呼び出します。
これで、 'getItemViewType()'の内部にロジックを書き込んで、このStringに従って0/1を返します。 – Nizam

+0

今私はそれを得る、私のエラーは私のif文に "convertView!= null"は "convertView == null"に変更する必要があります – VincentTheonardo

関連する問題