【问题标题】:Android: List view with drop down detailed view (not spinner or not expandable list view)Android:带有下拉详细视图的列表视图(不是微调器或不可扩展的列表视图)
【发布时间】:2015-10-16 18:41:39
【问题描述】:

您好,我正在尝试使用下拉详细视图进行列表视图。例如看到这个Image 1。当我们单击任何列表视图时,它会显示详细视图(相对于列表视图),如Image 2。此详细视图不像可扩展列表视图或微调器。请帮我这样做

【问题讨论】:

  • 这在消耗性列表视图中是非常可以实现的,那么为什么你不想要expendable list view??

标签: android android-listview drop-down-menu


【解决方案1】:

请查看我刚刚设置的这个 github https://github.com/lt-tibs1984/ExpandableListView

这个想法是使用可见性隐藏和显示视图,这里有一些代码说明了这一点:

首先设置你的 Item 类或你想使用的任何对象(简单的 pojo 实现 Parcelable)

public class Item implements Parcelable{

public String title;
public String description;
public boolean isExpanded;

public Item(){}

public Item(Parcel in){
    title = in.readString();
    description = in.readString();
    isExpanded = in.readInt() == 1;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(title);
    dest.writeString(description);
    dest.writeInt(isExpanded ? 1 : 0);
}

public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>(){
    @Override
    public Item createFromParcel(Parcel source) {
        return new Item(source);
    }

    @Override
    public Item[] newArray(int size) {
        return new Item[size];
    }
};
}

然后创建你的适配器:

public class ExpandableAdapter extends BaseAdapter{

List<Item> items;
Context context;

public class Row{
    AppCompatTextView mTvTitle;
    AppCompatTextView mTvDescription;
    FrameLayout mFlWrapper;
    ImageView mIvArrow;
}

public ExpandableAdapter(Context context, List<Item> items){
    this.items = items;
    this.context = context;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Row theRow;

    if(convertView == null){
        theRow = new Row();
        convertView = LayoutInflater.from(context).inflate(R.layout.row_item, parent, false);
        theRow.mFlWrapper = (FrameLayout) convertView.findViewById(R.id.fl_wrapper);
        theRow.mTvTitle = (AppCompatTextView) convertView.findViewById(R.id.tv_title);
        theRow.mTvDescription = (AppCompatTextView) convertView.findViewById(R.id.tv_description);
        theRow.mIvArrow = (ImageView) convertView.findViewById(R.id.iv_arrow);

        convertView.setTag(theRow);
    }else{

        theRow = (Row) convertView.getTag();
    }

    // Update the View
    Item item = items.get(position);
    if(item.isExpanded){
        theRow.mFlWrapper.setVisibility(View.VISIBLE);
        theRow.mIvArrow.setRotation(180f);
    }else{
        theRow.mFlWrapper.setVisibility(View.GONE);
        theRow.mIvArrow.setRotation(0f);
    }

    theRow.mTvTitle.setText(item.title);
    theRow.mTvDescription.setText(item.description);


    // return the view
    return convertView;
}
}

终于在你的活动中:

 public class MainActivity extends AppCompatActivity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    ListView lvItems = (ListView) findViewById(R.id.lv_items);
    ExpandableAdapter adapter = getAdapter();

    lvItems.setAdapter(adapter);
    lvItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ExpandableAdapter adapter = (ExpandableAdapter) parent.getAdapter();

            Item item = (Item) adapter.getItem(position);
            if(item != null){
                if(item.isExpanded){
                    item.isExpanded = false;

                }else{
                    item.isExpanded = true;
                }
            }
            adapter.notifyDataSetChanged();
        }
    });
}


private ExpandableAdapter getAdapter(){

    List<Item> items = new ArrayList<>();

    for(int i = 0; i < 50; i++){
        Item item = new Item();
        item.title = "Title Item " + i;
        item.description = "Description for Title Item "+ i;
        item.isExpanded = false;

        items.add(item);
    }

    return new ExpandableAdapter(this, items);
}
}   

【讨论】:

  • 嗨,我是安卓新手。如果您不介意可以使用 eclipse (ADT) 提供示例代码
  • @kiran 请继续使用 Android Studio,因为这是官方的 Android IDE,但您可以创建 MainActivity.java、ExpandableListAdapter.java 和 Item.java,然后将代码从github。您需要将支持库添加为依赖项,或者将 AppCompatTextView 更改为 TextView
  • 感谢您的帮助。现在我正在尝试通过使用您的说明来实现这一目标。正如你所说,我将来会使用 IDE
【解决方案2】:

特别感谢“inner_class7”:根据“inner_class7”我得到了答案,但是通过使用他的代码我必须满足两个要求

要求 1:当我们点击描述时,展开的视图正在关闭,但我不想关闭视图

要求2:我想在扩展新视图时关闭之前的视图(如果存在)

要实现以上两个要求,请按照以下步骤更新“inner_class7”代码

第 1 步: 创建 Global.java

public class Global {

  public static Item itemGlobal;

}

第 2 步: 更新 MainActivity.java

import static com.app.listviewdrop.Global.itemGlobal;


public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_view_drop);


    ListView lvItems = (ListView) findViewById(R.id.lv_items);
    ExpandableAdapter adapter = getAdapter();

    lvItems.setAdapter(adapter);
    lvItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ExpandableAdapter adapter = (ExpandableAdapter) parent.getAdapter();

            Item item = (Item) adapter.getItem(position);

            if(item != null){
                if(item.isExpanded){
                    item.isExpanded = false;

                }else{
                    item.isExpanded = true;

                    itemGlobal = (Item)adapter.getItem(position);
                }
            }

            adapter.notifyDataSetChanged();
        }
    });
}


private ExpandableAdapter getAdapter(){

    List<Item> items = new ArrayList<Item>();

    for(int i = 0; i < 50; i++){
        Item item = new Item();
        item.title = "Title Item " + i;
        item.description = "Description for Title Item "+ i;
        item.isExpanded = false;

        items.add(item);
    }

    return new ExpandableAdapter(this, items);
}
}

第 3 步: 更新 ExpandableAdapter.java

import static com.YOUR PACKAGE NAME.itemGlobal;


public class ExpandableAdapter extends BaseAdapter {

List<Item> items;
Context context;
// List<Item> list = new ArrayList<Item>();


public class Row {
    AppCompatTextView mTvTitle;
    AppCompatTextView mTvDescription;
    FrameLayout mFlWrapper;
    ImageView mIvArrow;
}

public ExpandableAdapter(Context context, List<Item> items) {
    this.items = items;
    this.context = context;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Row theRow;

    if (convertView == null) {
        theRow = new Row();
        convertView = LayoutInflater.from(context).inflate(R.layout.row_item, parent, false);
        theRow.mFlWrapper = (FrameLayout) convertView.findViewById(R.id.fl_wrapper);
        theRow.mTvTitle = (AppCompatTextView) convertView.findViewById(R.id.tv_title);
        theRow.mTvDescription = (AppCompatTextView) convertView.findViewById(R.id.tv_description);
        theRow.mIvArrow = (ImageView) convertView.findViewById(R.id.iv_arrow);

        convertView.setTag(theRow);


        theRow.mFlWrapper.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

            }
        });


    } else {

        theRow = (Row) convertView.getTag();
    }

    // Update the View
    Item item = items.get(position);


    if (item.isExpanded) {

        if(item == itemGlobal){

            theRow.mFlWrapper.setVisibility(View.VISIBLE);
            theRow.mIvArrow.setRotation(180f);

        }else {
            theRow.mFlWrapper.setVisibility(View.GONE);
            theRow.mIvArrow.setRotation(0f);

            item.isExpanded = false;
        }

    } else {
        theRow.mFlWrapper.setVisibility(View.GONE);
        theRow.mIvArrow.setRotation(0f);


    }


    theRow.mTvTitle.setText(item.title);
    theRow.mTvDescription.setText(item.description);

    // return the view
    return convertView;
}

}

我仅在“inner_class7”的帮助下实现了这些要求。非常感谢“inner_class7”

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多