2015-01-09 2 views
1

커스텀 CursorAdapter와 2 가지 레이아웃 유형이있는리스트 뷰가 있습니다. onCreate에서 하나의 레이아웃 유형만을 사용하여 로컬 데이터베이스의 데이터로리스트 뷰를 채 웁니다. 그런 다음 인터넷에서 데이터를 다운로드하고 목록 레이아웃의 TOP에 새 행을 추가합니다 (다음 방법 사용 : How to insert extra elements into a SimpleCursorAdapter or Cursor for a Spinner?). 나는 새로운 레이아웃이 부 풀리지 않고 appView가 bindView에서 행을 채울 때 NullPointerException으로 인해 충돌하기 때문에 어댑터가 이전 레이아웃을 재사용한다고 가정한다. (두 번째 레이아웃 유형에 대한 viewholder를 사용하지 않는다.). 이 문제를 어떻게 해결할 수 있습니까? 어쩌면 어댑터가 어떻게 든 뷰를 "다시 플래닝"하도록 강제 할 수 있습니까?리스트 뷰에 다른 레이아웃의 항목을 동적으로 추가하기

조각 : 내 코드는 대략처럼 보이는 방법은 다음과

이다

public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ 

    private ListView mListView; 
    private CustomCursorAdapter cursorAdapter; 

    public MyFragment() { 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     getLoaderManager().initLoader(0, null, this); 
     super.onActivityCreated(savedInstanceState); 
    } 

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

     cursorAdapter = new CustomCursorAdapter(getActivity(), null, 0); 
     mListView.setAdapter(cursorAdapter); 

     return mListView; 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     return new CursorLoader(
       getActivity(), 
       CONTENT_URI, 
       projection, 
       selection, 
       selectionArgs, 
       sortOrder 
     ); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     cursorAdapter.swapCursor(data); 
     new SomeTask().execute(/*params*/); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     cursorAdapter.swapCursor(null); 
    } 

    private class SomeTask extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      //Download some stuff 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      //Add downloaded stuff to cursor 
      cursorAdapter.swapCursor(extendedCursor); 
     } 
    } 
} 

어댑터 대 : 그것은 포함하는 단일 뷰를 사용하는 것입니다 할

public class CustomCursorAdapter extends CursorAdapter { 

    private static final int VIEW_TYPE_COUNT = 2; 
    private static final int VIEW_TYPE_ONE = 0; 
    private static final int VIEW_TYPE_TWO = 1; 

    public CustomCursorAdapter(Context context, Cursor c, int flags) { 
     super(context, c, flags); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     int viewType = getItemViewType(cursor.getPosition()); 
     View view; 
     switch (viewType) { 
      case VIEW_TYPE_ONE: { 
       view = LayoutInflater.from(context).inflate(R.layout.layout_one, parent, false); 

       ViewHolder viewHolder = new ViewHolder(view); 
       view.setTag(viewHolder); 
      } 
      case VIEW_TYPE_TWO: { 
       view = LayoutInflater.from(context).inflate(R.layout.layout_two, parent, false); 
      } 
     } 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     int viewType = getItemViewType(cursor.getPosition()); 
     switch (viewType){ 
      case VIEW_TYPE_ONE: 
       // populate view using the viewholder 
       break; 
      case VIEW_TYPE_TWO: 
       // populate newly added row, ((TextView)findViewById).setText() throws NullPointerException 
       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return /*is the new view added*/ && position == 0 ? VIEW_TYPE_TWO : VIEW_TYPE_ONE; 
    } 

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

    public static class ViewHolder { 

     //cache views here 

     public ViewHolder(View view) { 
     } 
    } 
} 

답변

1

고객님의 switch에 대한 break 문은 newView 방법에 입력하지 않았습니다.

+0

그리고 저는 정말로했습니다. 때로는 내가 얼마나 특별한지 생각 나게하기 위해 등을 가볍게 두드리는 일이 필요합니다. 나는 항상 그 것을 잊어 버립니다 ... – Longi

0

한 가지 방법 두 뷰의 모든 요소와 각 요소에 대해 .setEnabled (boolean) 및/또는 .setVisibility (int)를 사용하여 어떤 뷰가 표시되는지 제어합니다.

+0

하지만 그게 못생긴 : c – Longi

+0

예, 코드가 좀 못 생겼어. 어떤 종류의 viewGroup을 사용하여 정리할 수 있습니다. 온 스크린 디스플레이는 원하는 모양을 유지해야합니다. – pgs