我有两个问题:
1
我正在使用带有NestedScrollView的CollapsingToolbarLayout,我的布局内容是。
当NestedScrollView内的内容变大时,它会将视图的起始位置移到NestedScrollView内部的中间位置。
更具体地说,添加gridView后问题就开始了?
外观如何:
http://files.spicygames.net/200000231-ed6afee6df/device-2015-08-11-164306.png?rnd=5004167712759227
2
在NestedScrollView中我有一个gridView。这应该包含来自json响应的所有图像。图像数量不同,所以它应该是wrap_content。但是当我将它设置为wrap_content时,只显示第一行,其余部分被截断。
我如何实现这一目标?
问题图片:
http://files.spicygames.net/200000225-45bee46b8e/device-2015-08-11-164028.png?rnd=09583999146707356
My CollapsingToolbarLayout:
<android.support.design.widget.CoordinatorLayout
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="match_parent"
android:fitsSystemWindows="true"
android:background="#fff3f3f3">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="#80000000"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp"
android:fitsSystemWindows="true">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="420dp"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layout_gravity="fill_vertical"
android:overScrollMode="never"
android:layout_marginBottom="?attr/actionBarSize"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<------My NestedScrollView Content is here----->
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:elevation="2dp"
app:layout_anchor="@id/app_bar_layout"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/ic_star_white_24dp"
/>
我的NestedScrollView内容:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="3dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background_with_shadow"
android:orientation="vertical"
android:id="@+id/first"
style="@style/Shadow"
android:elevation="1dp"
>
<TextView
android:id="@+id/biography_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:text="Biography"
android:padding="5dp"
android:textSize="15sp"
android:textColor="@color/PrimaryText"/>
<TextView
android:id="@+id/biography"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="@color/SecondaryText"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/second"
android:background="@drawable/background_with_shadow"
style="@style/Shadow"
android:elevation="1dp">
<TextView
android:id="@+id/companytext1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Images"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:textSize="15sp"
android:textColor="@color/PrimaryText"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="200dp"
android:overScrollMode="never"
android:padding="5dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="150dp"
android:background="@drawable/background_with_shadow"
android:orientation="vertical"
android:id="@+id/thrid"
style="@style/Shadow"
android:elevation="1dp"
android:layout_marginBottom="5dp"
>
<TextView
android:id="@+id/Details_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:text="Details"
android:padding="5dp"
android:textSize="15sp"
android:textColor="@color/PrimaryText"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/birth_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Birthday"
android:layout_gravity="start"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="#000000"/>
<TextView
android:id="@+id/birth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_toRightOf="@+id/birth_text"
android:layout_toEndOf="@+id/birth_text"
android:layout_gravity="end"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="@color/SecondaryText"/>
<TextView
android:id="@+id/Place_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/birth_text"
android:padding="5dp"
android:text="Place of birth"
android:layout_gravity="start"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="#000000"/>
<TextView
android:id="@+id/Place"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_toEndOf="@+id/Place_text"
android:layout_toRightOf="@+id/Place_text"
android:layout_below="@+id/birth_text"
android:layout_gravity="end"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="@color/SecondaryText"/>
<TextView
android:id="@+id/death_text"
android:layout_below="@+id/Place_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Deathday"
android:layout_gravity="start"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="#000000"/>
<TextView
android:id="@+id/death"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_below="@+id/Place_text"
android:layout_toRightOf="@+id/death_text"
android:layout_toEndOf="@+id/death_text"
android:layout_gravity="end"
android:text="-"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:textSize="12sp"
android:lineSpacingMultiplier="1.2"
android:gravity="start"
android:textColor="@color/SecondaryText"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/fourth"
android:background="@drawable/background_with_shadow"
style="@style/Shadow"
android:elevation="1dp">
<TextView
android:id="@+id/grid_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Also known for"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:textSize="15sp"
android:textColor="@color/PrimaryText"/>
<GridView
android:layout_width="match_parent"
android:layout_height="1000dp"
android:id="@+id/upcoming_gridlayout"
style="@style/Shadow"
android:elevation="1dp"
android:numColumns="2"
>
</GridView>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="?attr/actionBarSize">
</View>
</LinearLayout>
我的活动CrewCastSingleItem:
public class CrewCastSingleItem extends Activity {
// create var
String ProfileImage;
String Id;
String Name;
String ProfilePathUrl;
String biography;
String name;
String placeOfBirth;
String deathday;
String birthday;
ImageAdapter adapter;
CrewCastGridViewAdapter Gridadapter;
GridView Gridv;
ArrayList<HashMap<String, String>> mylistForPersonImages;
ArrayList<HashMap<String, String>> mylistForPersonFilmImages;
JSONObject json = null;
JSONArray results = null;
private static final String apiKey = "Mykey";
private static final String tmdbURL = "MyURl";
static final String TAG_POSTERPATH = "poster_path";
static final String TAG_TITLE = "original_title";
static final String TAG_ID = "id";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cast_single_item);
// Get specific movie data
Intent i = getIntent();
// Get the result of poster
// Get the result of movie details for textviews
ProfileImage = i.getStringExtra("profile_path");
Name = i.getStringExtra("name");
Id = i.getStringExtra("credit_id");
ProfilePathUrl = "http://image.tmdb.org/t/p/w500" + ProfileImage;
// Locate Imageviews
ImageView ImagePoster = (ImageView) findViewById(R.id.image);
// load images url into poster
Picasso.with(getApplicationContext()).load(ProfilePathUrl).into(ImagePoster);
CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingToolbarLayout.setTitle(Name) ;
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.parseColor("#ffffff"));
collapsingToolbarLayout.setExpandedTitleTextAppearance(Color.parseColor("#ffffff"));
// Items for download data
//Initialize with empty data
mylistForPersonImages = new ArrayList<HashMap<String, String>>();
mylistForPersonFilmImages = new ArrayList<HashMap<String, String>>();
new DownloadJSON().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_upcoming_singe_item, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
// Downloading data asynchronously
private class DownloadJSON extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... url) {
json = JSONfunctions.getJSONfromURL(tmdbURL + "/3/person/" + Id
+ apiKey +"&append_to_response=images,combined_credits");
try {
biography = json.getString("biography");
birthday = json.getString("birthday");
deathday = json.getString("deathday");
name = json.getString("name");
placeOfBirth = json.getString("place_of_birth");
// Get person images
JSONObject images = json.getJSONObject("images");
JSONArray Imagearray = images.getJSONArray("profiles");
for (int i=0; i<Imagearray.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject actor = Imagearray.getJSONObject(i);
String filepath = actor.getString("file_path");
map.put("file_path", filepath);
mylistForPersonImages.add(map);
}
JSONObject othermovies = json.getJSONObject("combined_credits");
JSONArray otherMoviewarray = othermovies.getJSONArray("cast");
for (int i=0; i<otherMoviewarray.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject actor = otherMoviewarray.getJSONObject(i);
String filepath = actor.getString(TAG_POSTERPATH);
String title = actor.getString(TAG_TITLE);
String id = actor.getString(TAG_ID);
map.put(TAG_TITLE, title);
map.put(TAG_ID, id);
map.put(TAG_POSTERPATH, filepath);
mylistForPersonFilmImages.add(map);
// Log.v("JSON", "output " + map); // remove before release
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
TextView biographyView = (TextView) findViewById(R.id.biography);
biographyView.setText(biography);
TextView deathView = (TextView) findViewById(R.id.death);
deathView.setText(deathday);
TextView birthView = (TextView) findViewById(R.id.birth);
birthView.setText(birthday);
TextView placeView = (TextView) findViewById(R.id.Place);
placeView.setText(placeOfBirth);
// Locate viewpager
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
adapter = new ImageAdapter(getApplicationContext(), mylistForPersonImages);
viewPager.setAdapter(adapter);
Gridv = (GridView) findViewById(R.id.upcoming_gridlayout);
Gridadapter = new CrewCastGridViewAdapter(getApplicationContext(), mylistForPersonFilmImages);
Gridv.setAdapter(Gridadapter);
}
}
}
GridviewAdapter及其布局:
public class UpcomingGridViewAdapter extends BaseAdapter {
public boolean pressedMovieItem;
Context context;
ArrayList<HashMap<String, String>> data;
HashMap<String, String>mylist = new HashMap<>();
public UpcomingGridViewAdapter(Context a, ArrayList<HashMap<String, String>> d) {
context = a;
data = d;
}
public int getCount() {
return data.size();
}
public HashMap<String, String> getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.upcoming_grid_item, parent, false);
}
final ImageView poster = (ImageView) convertView.findViewById(R.id.upcoming_image);
// System.out.println(data.get(position));
//final HashMap<String, String>mylist = data.get(position);
mylist = data.get(position);
// TextView title = (TextView) vi.findViewById(R.id.textView1);
// title.setText((CharSequence) mylist.get("title"));
final String posterPath = mylist.get("poster_path");
// set image url correctly
// sizes for image 45, 92, 154, 185, 300, 500
final String url = "http://image.tmdb.org/t/p/w185" + posterPath;
if(mylist.get("poster_path") != "null") {
// load image url into poster
Picasso.with(context).load(url).into(poster);
}
else{
// load image url into poster
Picasso.with(context).load(R.drawable.ic_local_movies_black_24dp).into(poster);
poster.setBackgroundColor(Color.parseColor("#F5F5F5"));
poster.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
}
// Get onclick of item and pass data to singleitemview for upcoming
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mylist = data.get(position);
Intent intent = new Intent(context, UpcomingSingleItem.class);
intent.putExtra("poster_path", mylist.get(Upcoming.TAG_POSTER));
intent.putExtra("title", mylist.get(Upcoming.TAG_TITLE));
intent.putExtra("release_date", mylist.get(Upcoming.TAG_RELEASE));
intent.putExtra("overview", mylist.get(Upcoming.TAG_OVERVIEW));
intent.putExtra("id", mylist.get(Upcoming.TAG_ID));
intent.putExtra("vote_average", mylist.get(Upcoming.TAG_VOTE_AVG));
context.startActivity(intent);
}
});
return convertView;
}
}
网格项的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerHorizontal="true"
android:gravity="center"
>
<ImageView android:layout_width="123.3dp"
android:layout_height="185.3dp"
android:id="@+id/upcoming_image"
android:scaleType="fitXY"
/>
答案 0 :(得分:2)
所以我遇到了同样的问题。但是,我使用RecyclerView而不是GridView。 我通过使用扩展GridLayoutManager的自定义LayoutManager解决了“仅显示第一行”的问题:
public class WrappingGridLayoutManager extends GridLayoutManager {
private int[] mMeasuredDimension = new int[2];
private int rowCount;
public WrappingGridLayoutManager(Context context, int spanCount, int itemsNo) {
super(context, spanCount, GridLayoutManager.VERTICAL, false);
rowCount = itemsNo / spanCount;
if (itemsNo % spanCount > 0) {
rowCount = rowCount + 1;
}
}
public WrappingGridLayoutManager(Context context, int spanCount, int itemsNo, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
rowCount = itemsNo / spanCount;
if (itemsNo % spanCount > 0) {
rowCount = rowCount + 1;
}
}
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
int widthSpec, int heightSpec) {
final int widthMode = View.MeasureSpec.getMode(widthSpec);
final int heightMode = View.MeasureSpec.getMode(heightSpec);
final int widthSize = View.MeasureSpec.getSize(widthSpec);
final int heightSize = View.MeasureSpec.getSize(heightSpec);
measureScrapChild(recycler, 0,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
int width = mMeasuredDimension[0];
int height = mMeasuredDimension[1];
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
width = widthSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
height = heightSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
height = height * rowCount;
setMeasuredDimension(width, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
int heightSpec, int[] measuredDimension) {
if (getItemCount() > 0) {
View view = recycler.getViewForPosition(position);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth();
measuredDimension[1] = view.getMeasuredHeight();
recycler.recycleView(view);
}
}
}
}
在创建项目实例时提供项目数,以便计算视图的高度。然后将它用于您的recyclerView:
recyclerView.setLayoutManager(new WrappingGridLayoutManager(this, 2, items.size()));
recyclerView.setAdapter(new YourAdapter(items));
如果你已经解决了错误的起始位置问题,请告诉我。感谢