レストランのメニューを含む展開可能なリストビューを作成しています。ユーザーが項目の 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();
}
}