커스텀 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) {
}
}
}
그리고 저는 정말로했습니다. 때로는 내가 얼마나 특별한지 생각 나게하기 위해 등을 가볍게 두드리는 일이 필요합니다. 나는 항상 그 것을 잊어 버립니다 ... – Longi