Android 无法在 ListView 内滚动 ListView
Can't scroll ListView inside ListView in Android
在尝试在我的应用程序中创建新闻提要时,我创建了自定义 ListView 适配器。我的单个 ListView 项目有一个 ImageView、WebView 和 ListView。所以我在 ListView 中有一个 ListView。问题是,当我尝试滚动内部 ListView 时,外部 ListView 正在滚动。我应该改变什么来避免这个问题?
我的自定义适配器:
public class TestCustomAdapter extends BaseAdapter {
private List<String> imageNames = null;
private List<String> descriptions = null;
private List<String> innerLVitems = null;
private LayoutInflater mInflater;
private Context context;
public FirstFragmentLVAdapter(Context context, List<String> imageNames, List<String> descriptions, List<String> innerLVitems) {
this.imageNames = imageNames;
this.descriptions = descriptions;
this.innerLVitems = innerLVitems;
this.context = context;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return innerLVitems.size();
}
public Object getItem(int position) {
List <String> returnedList = new ArrayList<>();
returnedList.add(imageNames.get(position));
returnedList.add(descriptions.get(position));
returnedList.add(innerLVitems.get(position));
return returnedList;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.firstfragment_listview_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.eventImage);
holder.description = (WebView) convertView.findViewById(R.id.eventDescriptionWV);
holder.LV = (ListView) convertView.findViewById(R.id.LV);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(context.getResources().getIdentifier(imageNames.get(position), "drawable", context.getPackageName()));
String webViewText = "<html><body><p align=\"justify\">"+
descriptions.get(position)+"</p></body></html>";
holder.description.loadDataWithBaseURL(null, webViewText, "text/html", "UTF-8", null);
String [] items = innerLVitems.get(position).split("\s*,\s*");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_1, android.R.id.text1, items);
holder.LV.setAdapter(adapter);
return convertView;
}
static class ViewHolder {
ImageView image;
WebView description;
ListView LV;
}
}
我的列表视图项目:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp">
<ImageView
android:id="@+id/eventImage"
android:layout_width="wrap_content"
android:layout_height="125dp"
app:srcCompat="@drawable/autumn" />
<WebView
android:id="@+id/eventDescriptionWV"
android:layout_width="match_parent"
android:layout_height="220dp"
android:layout_below="@id/eventImage"></WebView>
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/eventDescriptionWV"
android:text="Text" />
<ListView
android:divider="@null"
android:dividerHeight="0dp"
android:id="@+id/LV"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@id/label" />
要使用 2 个嵌套 ListViews
,您应该使用 ExpandableListView
:https://developer.android.com/reference/android/widget/ExpandableListView.html。
使用 2 ListViews
Android 将始终在它找到的第一个上应用滚动。 ExpandableListView
组件专门用于处理列表中的子列表。
您可能希望将 RecyclerView
与 NestedScrollView
一起使用并关闭 RecyclerView
的嵌套滚动。这样你就可以在同一方向上有多个可滚动项目。
我能够为我的案例找到解决方案。我需要将此行添加到内部 ListView XML:
android:nestedScrollingEnabled="true"
这仅适用于 Lollipop 及更高版本。
在尝试在我的应用程序中创建新闻提要时,我创建了自定义 ListView 适配器。我的单个 ListView 项目有一个 ImageView、WebView 和 ListView。所以我在 ListView 中有一个 ListView。问题是,当我尝试滚动内部 ListView 时,外部 ListView 正在滚动。我应该改变什么来避免这个问题?
我的自定义适配器:
public class TestCustomAdapter extends BaseAdapter {
private List<String> imageNames = null;
private List<String> descriptions = null;
private List<String> innerLVitems = null;
private LayoutInflater mInflater;
private Context context;
public FirstFragmentLVAdapter(Context context, List<String> imageNames, List<String> descriptions, List<String> innerLVitems) {
this.imageNames = imageNames;
this.descriptions = descriptions;
this.innerLVitems = innerLVitems;
this.context = context;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return innerLVitems.size();
}
public Object getItem(int position) {
List <String> returnedList = new ArrayList<>();
returnedList.add(imageNames.get(position));
returnedList.add(descriptions.get(position));
returnedList.add(innerLVitems.get(position));
return returnedList;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.firstfragment_listview_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.eventImage);
holder.description = (WebView) convertView.findViewById(R.id.eventDescriptionWV);
holder.LV = (ListView) convertView.findViewById(R.id.LV);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(context.getResources().getIdentifier(imageNames.get(position), "drawable", context.getPackageName()));
String webViewText = "<html><body><p align=\"justify\">"+
descriptions.get(position)+"</p></body></html>";
holder.description.loadDataWithBaseURL(null, webViewText, "text/html", "UTF-8", null);
String [] items = innerLVitems.get(position).split("\s*,\s*");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_1, android.R.id.text1, items);
holder.LV.setAdapter(adapter);
return convertView;
}
static class ViewHolder {
ImageView image;
WebView description;
ListView LV;
}
}
我的列表视图项目:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp">
<ImageView
android:id="@+id/eventImage"
android:layout_width="wrap_content"
android:layout_height="125dp"
app:srcCompat="@drawable/autumn" />
<WebView
android:id="@+id/eventDescriptionWV"
android:layout_width="match_parent"
android:layout_height="220dp"
android:layout_below="@id/eventImage"></WebView>
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/eventDescriptionWV"
android:text="Text" />
<ListView
android:divider="@null"
android:dividerHeight="0dp"
android:id="@+id/LV"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@id/label" />
要使用 2 个嵌套 ListViews
,您应该使用 ExpandableListView
:https://developer.android.com/reference/android/widget/ExpandableListView.html。
使用 2 ListViews
Android 将始终在它找到的第一个上应用滚动。 ExpandableListView
组件专门用于处理列表中的子列表。
您可能希望将 RecyclerView
与 NestedScrollView
一起使用并关闭 RecyclerView
的嵌套滚动。这样你就可以在同一方向上有多个可滚动项目。
我能够为我的案例找到解决方案。我需要将此行添加到内部 ListView XML:
android:nestedScrollingEnabled="true"
这仅适用于 Lollipop 及更高版本。