这里有新的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传递给适配器。
问题在于:当我启动它时,两个列表页面都显示正常,但是当我在一个页面中单击列表项的按钮时,一个项目将从另一个页面的列表中消失。而不是相同的项目 - 始终是另一页的最后一项。有什么想法吗?
答案 0 :(得分:2)
以下是我认为您正在做的事情:
ArrayList<MasterBill> listOne = someFunctionThatReturnsAList();
ArrayList<MasterBill> listTwo = listOne;
如果这是您正在做的事情,那么您创建了两个指向同一列表的变量,这将产生您所面临的问题。
正确的方法是使用复制构造函数:
ArrayList<MasterBill> listTwo = new ArrayList<MasterBill>(listOne);