- MainActivity
- MoviesFragment
- ImageAdapter
片段XML佈局文件包含一個ListView。 listview有一個不同的佈局文件,我用它來設計每個電影在列表中的顯示方式。就像海報和標題一樣。
MoviesFragment從API獲取電影海報的URL並將其放入ArrayList < HashMap>。
這個HashMap被傳遞給ImageAdapter,它指出了ListView的填充方式。
海報圖像被設置爲來自ImageAdapter類的ImageView,但是它沒有找到該ID。
ImageAdapter:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<HashMap<String, String>> array;
private int width;
public ImageAdapter(Context context, ArrayList<HashMap<String, String>> paths, int x) {
mContext = context;
array = paths;
width = x;
}
@Override
public int getCount() {
return array.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
Drawable d = resizeDrawable(mContext.getResources().getDrawable(R.drawable.place_holder_img));
Picasso.with(mContext).load("http://image.tmdb.org/t/p/w185" + array.get(position)).resize(width, (int) (width * 1.5)).placeholder(d).into(imageView);
return imageView;
}
private Drawable resizeDrawable(Drawable image) {
Bitmap b = ((BitmapDrawable) image).getBitmap();
Bitmap bitmapResized = Bitmap.createScaledBitmap(b, width, (int) (width * 1.5), false);
return new BitmapDrawable(mContext.getResources(), bitmapResized);
}
}
MoviesFragment:
public class MoviesFragment extends Fragment {
static int width;
static ArrayList<HashMap<String, String>> posters;
static ListView listView;
static boolean sortByPop;
public MoviesFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
if (MainActivity.TABLET) {
width = size.x/6;
} else width = size.x/3;
listView = (ListView) rootView.findViewById(R.id.lvMovies);
//if fragment is visible
if (getActivity() != null) {
}
//handles listView item click
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println(posters.get(position));
}
});
return rootView;
}
@Override
public void onStart() {
super.onStart();
getActivity().setTitle("Most Popular Movies");
if (isNetworkAvailable()) {
listView.setVisibility(ListView.VISIBLE);
new ImageLoadTask().execute();
} else {
TextView textView = new TextView(getActivity());
RelativeLayout layout = (RelativeLayout)
getActivity().findViewById(R.id.relativelayout);
textView.setText("You are not connected to the internet!");
if (layout.getChildCount() == 1) {
layout.addView(textView);
}
listView.setVisibility(ListView.GONE);
}
}
public boolean isNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private class ImageLoadTask extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
while (true) {
try {
//generates the amount of inputs
String[] array = new String[]{"1", "2", "3", "5"};
posters = new ArrayList<>(getPathFromAPI(array, sortByPop));
return posters;
} catch (Exception e) {
continue;
}
}
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
if (result != null && getActivity() != null) {
//puts the images into the imageviews
ImageAdapter adapter = new ImageAdapter(getActivity(), result, width);
listView.setAdapter(adapter);
}
}
ArrayList<HashMap<String, String>> getPathFromAPI(String[] movieID, boolean sort) {
//gets movies and puts them into the posters arrayList
posters = new ArrayList<>();
for (String aMovieID : movieID) {
HashMap<String, String> map = new HashMap<>();
map.put("id", "/kqjL17yufvn9OVLyXYpvtyrFfak.jpg");
posters.add(map);
}
return posters;
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
public static boolean TABLET = false;
public boolean isTablet(Context context) {
boolean xlarge = ((context.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
boolean large = ((context.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
return (xlarge || large);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.relativelayout, new MoviesFragment())
.commit();
}
}
}
XML爲ListView佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView android:id="@+id/ivPosters"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/results_layout_tv_movie_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingLeft="20dp"
android:paddingStart="20dp"
android:paddingTop="10dp"
android:text="hellow"
android:textColor="#000"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
它工作。有點。 getview中的行必須進入if語句,該語句檢查視圖是否爲空。如果是它創造的元素 –
是的,我忘了它。真的需要'if(view == null){}' –