2017-05-05 18 views
0

我有三類:如何使用listview的佈局文件中的id?

  • 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> 

回答

0

檢查出你的ImageAdapter。 @Override public View getView(int position, View convertView, ViewGroup parent) {}你應該誇大你的佈局,找到身份證。 就像這樣:

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 

     view = View.inflate(context, R.layout.yourlayout, null); 
     tv = (TextView) view.findViewById(R.id.tv); 
     iv = (ImageView) view.findViewById(R.id.iv); 
     } 
+0

它工作。有點。 getview中的行必須進入if語句,該語句檢查視圖是否爲空。如果是它創造的元素 –

+0

是的,我忘了它。真的需要'if(view == null){}' –