2017-03-06 5 views
0

내 customAdapter에 다른 스타일을 지정하는 방법은 무엇입니까? 내 사용자 지정 어댑터는 getView 메서드에서 레이아웃보기를 가져옵니다. 내가하고 싶은 일은 다른 활동에서 어댑터가 호출 될 때 다른 스타일 레이아웃을 제공하는 것입니다. 나는 인터페이스를 사용하려하지만 보여줍니다이 내의 getView (INT 위치보기 convertView, 뷰 그룹의 부모) 메소드 내부에 내 코드입니다하나의 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() 내부에 논리를 작성하여이 문자열에 따라 0/1을 반환합니다. – Nizam

+0

이제 오류 메시지가 나타납니다. "convertView! = null"은 "convertView == null"로 변경되어야합니다. – VincentTheonardo