0

ここに新しいアンドロイド開発者。少しの間同じ問題と戦ってきたので、助けを求める時が来ました. 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 をアダプターに渡します。

ここに問題があります。起動すると、リストの両方のページが正しく表示されますが、一方のページでリスト項目のボタンをクリックすると、もう一方のページのリストから項目が消えます。同じアイテムではなく、常に別のページの最後のアイテムです。何か案は?

4

1 に答える 1

2

これがあなたがしていると私が思うことです:

ArrayList<MasterBill> listOne = someFunctionThatReturnsAList();

ArrayList<MasterBill> listTwo = listOne;

これがあなたがしていることであるなら、あなたは同じリストを指す2つの変数を作成しているので、あなたが直面している問題を引き起こすでしょう。

正しい方法は、コピーコンストラクターを使用することです。

ArrayList<MasterBill> listTwo = new ArrayList<MasterBill>(listOne);
于 2012-09-20T07:55:07.217 に答える