ViewPager ListViews似乎更新了彼此的适配器

时间:2012-09-20 07:07:33

标签: android listview android-viewpager fragment android-arrayadapter

这里有新的Android开发者。现在一直在与同样的问题作斗争,是时候寻求帮助了。我有一个应用程序,在FragmentActivity中扩展FragmentPagerAdapter(利用android.support.app.v4库),前两页包含列表片段(不是ListFragments,请注意,我正在放置ListViews的常规片段)。基本上,我的应用程序将一些数据从服务发送到自定义ArrayAdapter。诀窍是,第一页和第二页上的ListViews基于相同的数据;最终,将会有一些不同的渲染和商业逻辑应用于每个,但现在我只是想让两个列表出现。出于本测试的目的,每个列表应该以相同的数据开头,列表中的每个项目都有一个按钮;单击该按钮应使该行从当前片段的列表中消失,但不从另一个列表中消失。这是我的代码:

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;
}

接下来是主要活动类中的片段代码:

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传递给适配器。

问题在于:当我启动它时,两个列表页面都显示正常,但是当我在一个页面中单击列表项的按钮时,一个项目将从另一个页面的列表中消失。而不是相同的项目 - 始终是另一页的最后一项。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

以下是我认为您正在做的事情:

ArrayList<MasterBill> listOne = someFunctionThatReturnsAList();

ArrayList<MasterBill> listTwo = listOne;

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

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

ArrayList<MasterBill> listTwo = new ArrayList<MasterBill>(listOne);