android 我正在寻找ExpandableListView自动滚动到特定位置

kyxcudwk  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(333)

当用户从RecyclerView中选择特定组名时,我希望我的应用在ExpandableList中的特定组处自动滚动。我正在使用界面处理来自RecyclerView的点击
下面是我主要活动代码:

@Override
public void onItemClick(int position) {
    menuListForRestaurant.setVisibility(View.GONE);
    if (!menuOpenChecker){
        menuOpenChecker=true;
    }else{
        menuOpenChecker=false;
    }
    //The above code gets execute except for the below one
   listView.smoothScrollToPosition(position);// this line is not executing
}

@SuppressLint("ClickableViewAccessibility")
private void ListViewAdapter(final HashMap<String, ArrayList<ProductList>> objectMap, final ArrayList<String> headerList) {

    listViewAdapter= new RestaurantItemListView(RestaurantDetail.this.getApplicationContext(), objectMap,headerList);
    listView.setAdapter(listViewAdapter);
    listViewAdapter.notifyDataSetChanged();
}

private void RecyclerMenuView(ArrayList<String> headerList){
    menuItemRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    menuItemRecyclerView.getRecycledViewPool().clear();
    menuAdapterRecyclerView= new RestaurantMenuRecyclerView(headerList, this.getApplicationContext());
    menuItemRecyclerView.setItemAnimator(new DefaultItemAnimator());
    menuItemRecyclerView.setAdapter(menuAdapterRecyclerView);
    menuAdapterRecyclerView.notifyDataSetChanged();
    menuAdapterRecyclerView.setOnClick(RestaurantDetail.this);

}

这就像我提到的不工作的行,因为它没有在ExpandableListView中更新
提前谢谢你,请任何人??

w8rqjzmb

w8rqjzmb1#

我终于解决了这个问题,通过使用下面的简单代码:

//AutoScroll for menu
    int t = 0,j, e=0, l=0;

    for (int n=0; n<=position;n++){

        e= e +objectMap.get(textHeaderlist.get(n)).size();
        l= l+450;
    }

    t=position+1;

    j= 200+e+t+l;
    scrollView.scrollTo(5, j);

终于解决了我问题
不管怎样,谢谢你!

ssm49v7z

ssm49v7z2#

由于您使用的是NonScrollExpandableListView,因此ExpandableListView不会滚动。这里我展示了3种可能的解决方案:

  1. NonScrollExpandableListView和ScrollView(您当前的方法):您必须滚动ScrollView,而不是滚动ExpandableListView。如果ExpandableListView中有任何组处于展开状态,则很难计算滚动位置。因此,折叠所有组,然后只展开所需的组要容易得多。代码如下(我没有测试过):
for (int i = 0; i < listViewAdapter.getGroupCount(); i++) listView.collapseGroup(i);
 int a = header.getHeight(); // header refers to all views above the ExpandableListView.
 a += (listViewAdapter.getGroupView(0, false, null, null).getHeight() + listView.getDividerHeight())*
         position;
 scrollView.smoothScrollTo(0, a);
 listView.expandGroup(position);

2.带标题的可展开列表视图(NoScrollView):开始一个新的项目并尝试这个示例,验证它是否符合您的要求。在这里我使用了Spinner而不是RecyclerView。
MainActivity.java:

public class MainActivity extends AppCompatActivity {

LinkedHashMap<String, ArrayList<String>> dataList;
ExpandableListView expandableListView;
CustomBaseExpandableListAdapter adapter;

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

    dataList = createSampleList();
    expandableListView = findViewById(R.id.expandable_list_view);
    adapter = new CustomBaseExpandableListAdapter(getApplicationContext(), dataList);
    expandableListView.setAdapter(adapter);

    View header = getLayoutInflater().inflate(R.layout.header, null);
    Button btExpand = header.findViewById(R.id.bt_expand);
    btExpand.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for (int i = 0; i < adapter.getGroupCount(); i++) expandableListView.expandGroup(i);
        }
    });

    Spinner spinner = findViewById(R.id.selector);
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplication(), android.R.layout.simple_list_item_1,
            new ArrayList<>(dataList.keySet()));
    spinner.setAdapter(arrayAdapter);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            int a = 1; // Without header a=0, with header a=1.
            for (int j = 0; j < i; j++) {
                a += (expandableListView.isGroupExpanded(j) ? adapter.getChildrenCount(j) : 0) + 1;
            }
            // expandableListView.smoothScrollToPosition(a);
            expandableListView.smoothScrollToPositionFromTop(a, 0);
        }
        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });
    expandableListView.addHeaderView(header);
}

private LinkedHashMap<String, ArrayList<String>> createSampleList() {
    LinkedHashMap<String, ArrayList<String>> dataList = new LinkedHashMap<>();
    for (int i = 0; i < 10; i++) {
        ArrayList<String> childList = new ArrayList<>();
        for (int j = 0; j < 17; j++) {
            childList.add("Item " + i + "-" + j);
        }
        dataList.put("Group " + i, childList);
    }
    return dataList;
}
}

CustomBaseExpandableListAdapter.java:

public class CustomBaseExpandableListAdapter extends BaseExpandableListAdapter {
ArrayList<String> groupList;
LinkedHashMap<String, ArrayList<String>> dataList;
Context context;

public CustomBaseExpandableListAdapter(Context context, LinkedHashMap<String, ArrayList<String>> dataList) {
    this.context = context;
    this.dataList = dataList;
    groupList = new ArrayList(dataList.keySet());
}

@Override
public int getGroupCount() {
    return groupList.size();
}

@Override
public int getChildrenCount(int i) {
    return dataList.get(groupList.get(i)).size();
}

@Override
public String getGroup(int i) {
    return groupList.get(i);
}

@Override
public String getChild(int i, int i1) {
    return dataList.get(groupList.get(i)).get(i1);
}

@Override
public long getGroupId(int i) {
    return 0;
}

@Override
public long getChildId(int i, int i1) {
    return 0;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
    TextView textView;
    if (view == null) {
        textView = new TextView((context));
        textView.setTextSize(30);
        textView.setPadding(80, 0, 0, 0);
    } else {
        textView = (TextView) view;
    }
    textView.setText(getGroup(i));
    return textView;
}

@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
    TextView textView;
    if (view == null) {
        textView = new TextView((context));
        textView.setTextSize(20);
        textView.setPadding(120, 0, 0, 0);
    } else {
        textView = (TextView) view;
    }
    textView.setText(getChild(i, i1));
    return textView;
}

@Override
public boolean isChildSelectable(int i, int i1) {
    return true;
}
}

活动_主.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Spinner
    android:id="@+id/selector"
    android:layout_marginLeft="10dp"
    android:layout_width="match_parent"
    android:layout_height="50dp"/>

<ExpandableListView
    android:id="@+id/expandable_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:orientation="vertical">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    app:srcCompat="@drawable/ic_launcher_foreground" />

<Button
    android:id="@+id/bt_expand"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="+"
    android:textSize="30dp" />

</LinearLayout>

1.使用ViewPager作为子视图(ExpandableListView with ViewPager combination as its child)的可扩展列表视图,使用HorizontalRecyclerView作为子视图的可扩展列表视图(子视图为HorizontalScroll View的可扩展列表视图):使用其中一种方法并设置ExpandableListView的OnGroupExpandListener只展开一个组,那么我认为当前的RecyclerView在没有必要。

qxsslcnc

qxsslcnc3#

expandableListView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(final AbsListView view, final int scrollState) {
            if (scrollState == SCROLL_STATE_IDLE) {
                view.setOnScrollListener(null);

                // Fix for scrolling bug
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        view.setSelection(pos);
                    }
                });
            }
        }

        @Override
        public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
                             final int totalItemCount) { }
    });

'pos'滚动到位置值

相关问题