0

レストランのメニューを含む展開可能なリストビューを作成しています。ユーザーが項目の 1 つをクリックすると、項目の詳細が表示されます (たとえば、「アボカド ロール」の行をクリックすると、「アボカド、カニ、米」という新しいレイアウトが表示されます)。

標準ビューのスクリーンショットを次に示します。

(私は新しいので写真を投稿できませんが、ユーザーがリストビューを見た場合に表示されるものは次のとおりです。

製品説明

製品説明

PRODUCT DETAIL(別フォーマット)

製品説明

製品説明

アイデアは、デフォルトが食品の名前を特徴としているということです。ユーザーがクリックすると (最終的にはスワイプしますが、ここでは簡単に説明します)、説明が表示されます (黒で表示されます)。問題は、黒い行をスクロールすると元のデフォルト形式に戻ることです。(ユーザーがクリックした場所をインターフェイスに「記憶」させ、それらのボタンを押し続けて、ユーザーが注文したものを知ることができるようにしようとすると、問題はより深刻になります-そして、それは明らかにホルダーの仕組みを理解していないことに関係しています!)

各行内でビューフリッパーを使用していますが、高速で信頼性が高く、うまく機能しています。また、クリックすると 1 つの行だけが選択されます。これは素晴らしいことです。

私の唯一の問題は、スクロール時にビューフリッパーのステータスをホルダーに記憶させることができないことです。そのため、スクロールするたびにリセットされます。

たとえば、ステーキの例で、行の詳細ビューを表示してから、下にスクロールして上に戻ると、その行のビューは「アボカド ロール」という名前に戻ります。明らかに、ホルダーを正しく実装していないため、ビューフリッパーの値が記憶されますが、私の人生では、24時間試してもこれを理解できません!

これが私のアダプターコードです:

ExpandMenu Adapter を使用すると、リストが何を参照しているかがわかります。

public ExpandMenuAdapter(Context passedContext, ArrayList<ExpandOptionsGroup> passedGroupList){
    this.context = passedContext;
    this.groupList = passedGroupList;
}

getChildView コード: これはホルダーの問題だと思いますが、特定できません!

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {


    View rowView = null;

    String[] child = getChild(groupPosition, childPosition);


    if (rowView == null){
        LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        rowView = infalInflater.inflate(R.layout.item_row, null);

        final ViewHolder viewHolder = new ViewHolder();

        viewHolder.itemName = (TextView) rowView.findViewById(R.id.tvItem);
        viewHolder.itemPrice = (TextView) rowView.findViewById(R.id.tvPrice);
        viewHolder.itemDetail = (TextView) rowView.findViewById(R.id.tvDetail);
        viewHolder.itemLayout = (LinearLayout) rowView.findViewById(R.id.item_layout);
        viewHolder.rowFlipper = (ViewFlipper) rowView.findViewById(R.id.item_row_flipper);

        viewHolder.itemLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub  
                viewHolder.rowFlipper.showNext();
                Toast.makeText(context, "You clicked", Toast.LENGTH_SHORT).show();
            }
        });
        rowView.setTag(viewHolder);
        viewHolder.rowFlipper.setTag(groupList.get(groupPosition));
    }else{
        rowView = convertView;
        ((ViewHolder) rowView.getTag()).rowFlipper.setTag(groupList.get(groupPosition));
    }
    ViewHolder holder = (ViewHolder) rowView.getTag();
    //holder.rowFlipper.set(groupList.get(groupPosition));  CLEARLY THIS IS WRONG
    holder.itemName.setText(child[MenuXMLGettersSetters.ELEMENT_NAME]);
    holder.itemDetail.setText(child[MenuXMLGettersSetters.ELEMENT_DETAIL]);


    if(!child[MenuXMLGettersSetters.ELEMENT_PRICE].isEmpty()){
        holder.itemPrice.setText("$"+child[MenuXMLGettersSetters.ELEMENT_PRICE]);
    }else{
        holder.itemPrice.setText("");
    }
    return rowView;
}

private static class ViewHolder {
    public TextView itemName;
    public TextView itemPrice;
    public TextView itemDetail;
    public LinearLayout itemLayout;
    public ViewFlipper rowFlipper;

    private void getViewHolderDetail(){
        itemDetail.isShown();
    }
}
4

0 に答える 0