Android在ListView行中扩充新布局

时间:2014-06-25 15:02:24

标签: android listview android-listview

我有一个带有自定义适配器的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?

我几乎可以肯定我错过了什么,但我无法找到答案。

感谢您的帮助。

3 个答案:

答案 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()解决了我的问题。

我用最新的更改更新了代码。