0

新的安卓开发者在这里。现在一直在与同样的问题作斗争,是时候寻求帮助了。我有一个在 FragmentActivity 中扩展 FragmentPagerAdapter 的应用程序(利用 android.support.app.v4 库),前 2 页包含列表片段(不是 ListFragments,请注意,我将 ListViews 放在上面的常规片段)。基本上,我的应用程序将一些数据从服务发送到自定义 ArrayAdapter。诀窍是,第一页和第二页上的 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;

如果这是您正在做的事情,那么您正在创建两个指向同一个列表的变量,这将产生您面临的问题。

正确的方法是使用复制构造函数:

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