我有一个带有自定义适配器的ListView,它扩展了BaseAdapter。 当用户点击一行时,我想用另一个(两个不同的xml项目)替换整个布局。 我已经四处寻找解决方案,但找不到任何有效的方法。 这是我的代码:
private class ProductListViewAdapter extends BaseAdapter implements Filterable {
private static final int PRODUCT_ITEM_ID = 9999;
private ValueFilter valueFilter;
private int selectedItem = -1;
@Override
public int getCount() {
if (mBookedProducts != null)
return mBookedProducts.size();
else
return 1;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
if(mBookedProducts != null) {
if(selectedItem != position)
return getProductView(mBookedProducts.get(position), convertView, position);
else
return getProductAnswerView(position, convertView);
}
else
return getPlaceHolderItem(convertView);
}
private View getProductAnswerView(int position, View convertView) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.booked_product_answer_item, null);
Button noButton = (Button) view.findViewById(R.id.noButton);
noButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Button yesButton = (Button) view.findViewById(R.id.yesButton);
yesButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Accept Booking
Toast.makeText(getActivity(),"Réservation acceptée !", Toast.LENGTH_SHORT).show();
}
});
return view;
}
private View getProductView(final BookedProduct bookedProduct, final View convertView, final int position) {
View view = convertView;
if(convertView == null || convertView.getId() != PRODUCT_ITEM_ID) {
view = LayoutInflater.from(getActivity()).inflate(R.layout.booked_product_item, null);
}
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectedItem = position;
mBookedProductsListView.getAdapter().getView(position, view, mBookedProductsListView);
mBookedProductsListViewAdapter.notifyDataSetInvalidated();
}
});
TextView productName1 = (TextView) view.findViewById(R.id.productName1);
productName1.setText(bookedProduct.getName1().toUpperCase());
TextView productName2 = (TextView) view.findViewById(R.id.productName2);
productName2.setText(bookedProduct.getName2().toUpperCase());
TextView userName = (TextView) view.findViewById(R.id.customerName);
userName.setText(bookedProduct.getCustomerFirstName() + " " + bookedProduct.getCustomerLastName());
ImageView triangleImage = (ImageView) view.findViewById(R.id.triangleImage);
switch (bookedProduct.getState()){
case (-1) :
triangleImage.setImageResource(R.drawable.trianglered);
break;
case 0:
triangleImage.setImageResource(R.drawable.triangleorange);
break;
case 1 :
triangleImage.setImageResource(R.drawable.trianglegreen);
break;
}
return view;
}
private View getPlaceHolderItem(View view) {
view = LayoutInflater.from(getActivity()).inflate(R.layout.product_placeholder, null);
TextView placeHolderTV = (TextView) view.findViewById(R.id.placeHolderTV);
placeHolderTV.setText("Aucune réservation en cours");
return view;
}
}
}
用户点击时不会重新绘制布局。 如您所见,我尝试重绘此处指定的视图: How can I update a single row in a ListView?
我几乎可以肯定我错过了什么,但我无法找到答案。
感谢您的帮助。
答案 0 :(得分:0)
尝试覆盖getViewTypeCount()
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 3; // number of layout that getview inflate
}
来自开发者android
返回将由getView(int,View,ViewGroup)创建的视图类型数。每种类型代表一组可在getView(int,View,ViewGroup)中转换的视图。如果适配器始终为所有项返回相同类型的View,则此方法应返回1.
答案 1 :(得分:0)
我会为这样的项创建一个视图:RelativeLayout或FrameLayout,其中包含所有3个视图,一次只能看到一个。在bindView()
我会添加一个条件并显示一个,隐藏另一个2(在点击处理程序上)。
答案 2 :(得分:0)
更新:好的,我找到了答案。我以为调用getView就足以重新加载视图了。 它不是,至少在KitKat(4.4.3)上。 调用adapter.notifyDataSetInvalidated()解决了我的问题。
我用最新的更改更新了代码。