ここに新しいアンドロイド開発者。少しの間同じ問題と戦ってきたので、助けを求める時が来ました. FragmentActivity (android.support.app.v4 ライブラリを利用) で FragmentPagerAdapter を拡張するアプリがあり、最初の 2 ページにはリスト フラグメントが含まれています (ListFragments ではなく、ListView を配置している通常のフラグメント)。基本的に、私のアプリはサービスからカスタム ArrayAdapter にデータを送信します。秘訣は、1 ページ目と 2 ページ目の ListView が同じデータに基づいていることです。最終的には、それぞれに異なるレンダリングとビジネス ロジックが適用される予定ですが、今のところ、両方のリストが表示されるようにしようとしていました。このテストのために、各リストは同じデータで開始し、リスト内の各項目にはボタンがあります。ボタンをクリックすると、現在のフラグメントのリストからその行が消えますが、他のフラグメントのリストからは消えません。これが私のコードです:
public class CustomBillAdapterTest extends ArrayAdapter<MasterBill> {
Context context;
private ArrayList<MasterBill> billRows;
int resourceID;
private static LayoutInflater inflater = null;
public FragmentActivity fragment;
public ImageLoader imageLoader;
AppService as;
public CustomBillAdapterTest(FragmentActivity fragment, int resourceID, ArrayList<MasterBill> billRows) {
super(fragment, resourceID, billRows);
this.context = fragment;
this.billRows = billRows;
this.fragment = fragment;
this.resourceID = resourceID;
try {
as = (AppService) fragment.getApplicationContext();
imageLoader = new ImageLoader(fragment.getApplication());
} catch (Exception e) {
e.printStackTrace();
}
}
public int getCount() {
return billRows.size();
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
MasterBill master = getItem(position);
View vi = convertView;
if (convertView == null) {
inflater = (LayoutInflater) this.fragment.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(resourceID, null);
}
TextView itemText = (TextView) vi.findViewById(R.id.itemText);
TextView price = (TextView) vi.findViewById(R.id.price);
ImageView itemIcon = (ImageView) vi.findViewById(R.id.itemIcon);
Button button = (Button) vi.findViewById(R.id.button1);
itemText.setText(master.item_text);
price.setText(master.price);
imageLoader.DisplayImage(master.icon, itemIcon);
Log.d("position", Integer.toString(position));
button.setTag(position);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(fragment, "test2", Toast.LENGTH_SHORT).show();
billRows.remove(position);
notifyDataSetChanged();
}
});
return vi;
}
次に、Fragment のコードをメイン アクティビティ クラスに戻します。
public static class MyBillFragment extends Fragment {
private ListView list;
private static CustomBillAdapterTest adapter;
public MyBillFragment newInstance() {
MyBillFragment myBill = new MyBillFragment();
return myBill;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.mybill_frag, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
list = (ListView) this.getActivity().findViewById(R.id.list);
adapter = new CustomBillAdapterTest(this.getActivity(), R.layout.mybill_frag_listitem, myBill);
list.setAdapter(adapter);
}
}
次に、名前が異なることを除いて、そのような別の重複クラスがあり、別の (ただし最初は重複している) ArrayList をアダプターに渡します。
ここに問題があります。起動すると、リストの両方のページが正しく表示されますが、一方のページでリスト項目のボタンをクリックすると、もう一方のページのリストから項目が消えます。同じアイテムではなく、常に別のページの最後のアイテムです。何か案は?