为什么 Android CursorAdapter 调用同一个动作 3 次
Why Android CursorAdapter call 3 times the same action
我的 CursorAdapter 有问题,我必须用动态图像填充 listView。
我有一个 BBDD,其中一些字段的值为“1”或“0”。
在 bindView 中,当字段 returns 1 我将图像添加到 linearLayout.
问题是图片添加了3次,不知道为什么。
girlsFragmentAdapter:
public class girlsListFragmentCursoAdapter extends CursorAdapter {
public girlsListFragmentCursoAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.girls_list_row,parent,false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView girlName;
ImageView imgExercice = new ImageView(context);
LinearLayout linearImgRow = (LinearLayout) view.findViewById(R.id.exercices_list_row);
girlName = view.findViewById(R.id.txtvwGirlName);
if (cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")).equals("1") ) {
imgExercice.setImageResource(R.drawable.push_ups);
linearImgRow.addView(imgExercice);
Toast.makeText(context,"Pull ups: " +cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")),Toast.LENGTH_SHORT ).show();
}
girlName.setText(cursor.getString(cursor.getColumnIndexOrThrow("nombre")));
}
}
当调用 **OnActivityCreated 时,我从 Fragment ** 调用此适配器
girls_fragment
public class girls_fragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private WodDbAdapter mWodAdapter;
ListView lvWods;
private View rootview;
public girls_fragment() {
// Required empty public constructor
}
public static girls_fragment newInstance(String param1, String param2) {
girls_fragment fragment = new girls_fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lvWods = (ListView) getView().findViewById(R.id.lvwGirlsList);
mWodAdapter = new WodDbAdapter(getContext());
mWodAdapter.open();
fillData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
rootview = inflater.inflate(R.layout.fragment_girls_fragment,container,false);
return rootview;
}
private void fillData(){
Cursor mGirlsCursor = mWodAdapter.fetchAllWods("girl");
getActivity().startManagingCursor(mGirlsCursor);
String [] from = new String[]{WodDbAdapter.KEY_NOMBRE,};
int [] to = new int []{R.id.txtvwGirlName};
girlsListFragmentCursoAdapter mGirlsAdapter = new girlsListFragmentCursoAdapter(rootview.getContext(),mGirlsCursor);
lvWods.setAdapter(mGirlsAdapter);
}
}
结果是这样的:
如您所见,图片出现了 三次 次,而不是 一次
是因为下面的代码:
if (cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")).equals("1") ) {
imgExercice.setImageResource(R.drawable.push_ups);
linearImgRow.addView(imgExercice);
Toast.makeText(context,"Pull ups: " +cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")),Toast.LENGTH_SHORT ).show();
}
使用以下行:
linearImgRow.addView(imgExercice);
每次调用 bindView
时,您总是将 imgExercice
添加到 linearImgRow
。
我的 CursorAdapter 有问题,我必须用动态图像填充 listView。
我有一个 BBDD,其中一些字段的值为“1”或“0”。
在 bindView 中,当字段 returns 1 我将图像添加到 linearLayout.
问题是图片添加了3次,不知道为什么。
girlsFragmentAdapter:
public class girlsListFragmentCursoAdapter extends CursorAdapter {
public girlsListFragmentCursoAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.girls_list_row,parent,false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView girlName;
ImageView imgExercice = new ImageView(context);
LinearLayout linearImgRow = (LinearLayout) view.findViewById(R.id.exercices_list_row);
girlName = view.findViewById(R.id.txtvwGirlName);
if (cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")).equals("1") ) {
imgExercice.setImageResource(R.drawable.push_ups);
linearImgRow.addView(imgExercice);
Toast.makeText(context,"Pull ups: " +cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")),Toast.LENGTH_SHORT ).show();
}
girlName.setText(cursor.getString(cursor.getColumnIndexOrThrow("nombre")));
}
}
当调用 **OnActivityCreated 时,我从 Fragment ** 调用此适配器
girls_fragment
public class girls_fragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private WodDbAdapter mWodAdapter;
ListView lvWods;
private View rootview;
public girls_fragment() {
// Required empty public constructor
}
public static girls_fragment newInstance(String param1, String param2) {
girls_fragment fragment = new girls_fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lvWods = (ListView) getView().findViewById(R.id.lvwGirlsList);
mWodAdapter = new WodDbAdapter(getContext());
mWodAdapter.open();
fillData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
rootview = inflater.inflate(R.layout.fragment_girls_fragment,container,false);
return rootview;
}
private void fillData(){
Cursor mGirlsCursor = mWodAdapter.fetchAllWods("girl");
getActivity().startManagingCursor(mGirlsCursor);
String [] from = new String[]{WodDbAdapter.KEY_NOMBRE,};
int [] to = new int []{R.id.txtvwGirlName};
girlsListFragmentCursoAdapter mGirlsAdapter = new girlsListFragmentCursoAdapter(rootview.getContext(),mGirlsCursor);
lvWods.setAdapter(mGirlsAdapter);
}
}
结果是这样的:
如您所见,图片出现了 三次 次,而不是 一次
是因为下面的代码:
if (cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")).equals("1") ) {
imgExercice.setImageResource(R.drawable.push_ups);
linearImgRow.addView(imgExercice);
Toast.makeText(context,"Pull ups: " +cursor.getString(cursor.getColumnIndexOrThrow("pull_ups")),Toast.LENGTH_SHORT ).show();
}
使用以下行:
linearImgRow.addView(imgExercice);
每次调用 bindView
时,您总是将 imgExercice
添加到 linearImgRow
。