androidアダプタadapterの穴を浅く分析します
17485 ワード
プロジェクトで出会ったことは、私を2日近く苦しめて、今日経験を分かち合いました.これからは回り道をしないようにしましょう.androidのアダプタとは何か、どのように定義するかを簡単に説明します.アダプタの再利用性を追加する方法.プログラムの結合性を減らすには
アダプタはその名の通り適当に作られていますが、彼はどのように適当に作られていますか.メカニズムは何ですか.役割は何なのか、はい、javaを書くのは何がオブジェクト向けプログラミングなのか知っていると信じていますが、ここではオブジェクト向けで説明するのがとても分かりやすいです.実際にアダプタは各オブジェクトをその空間に置いてandoridページに表示しますが、今から理解すると、オブジェクトは事実上データの抽象体でしょう.ページ表示は通常xmlつまりビューでしょう.データはビューの形で表示されます.これがadapterの役割であり、対応する順序で表示することができます.対応する操作によってデータあるいはページの操作を行うことができて、それでは私のアダプタを見てみて、コードをつけます
これはbeanエンティティです
これはアダプタです
ブロガーが処理している間にグローバルなlistを使い始めたばかりですが、これはよくありません.もう一つの効果が得られていません.そして、ブロガーはjavaのオブジェクト向けにbeanを設定する方法を考え始めました.はい、ブロガーはadapterでグローバルの変数を定義し、if elseの外で取得しました.しかし、onclickerlistenerはif elseの中にあります.この方法はさて、かなり远いブロガーが上记したように、それを実行する问题です.このような话はスクリーンのスライドやリフレッシュの中のグローバルなデータが乱れているに违いありません.きっと乱れています.その时、さらに深く掘り下げると、上记のようなものになります.データをバインドしてイベントの傍受を行い、対応するデータを取得することです.必要な効果です.そしてviewの表示もそうします.乱れていません.
ここでadapterがどのようにxmlにデータをマッピングするかについてお話ししますが、一般的にはまずholderを書きます.中にはitemのxmlに必要なものが入っていて、そこでlayoutを探して、それから対応するidを探しに行きます.それからholderと対応します(対応するbeanで定義されています.通常はページ表示が必要ですが、データのバックグラウンド操作は対応するレイアウトidを必要としません)また、adapterの中のいくつかのピットを強調します.
getviewのpositionは固定されたいくつかの値で、相対的に、グローバル変数として使用しないでください.
注意adapterがactivityを開くなど
リスニングイベントはifelse構造体に書かないでください.イベント処理も同じで、外に置いて単独で処理します.
結合に注意してください.そうしないとコードが乱れます.道理によってプログラム猿の論理的思考は非常にはっきりしているはずです.いつも一つの考えがあなたをデカップリングすることができます.しかし、どちらがいいですか.そして、あなたの処理方法に適しています.この点はプログラム猿の経験が必要です.残りはみんなで体験してください.ここは浅い分析だけです.
アダプタはその名の通り適当に作られていますが、彼はどのように適当に作られていますか.メカニズムは何ですか.役割は何なのか、はい、javaを書くのは何がオブジェクト向けプログラミングなのか知っていると信じていますが、ここではオブジェクト向けで説明するのがとても分かりやすいです.実際にアダプタは各オブジェクトをその空間に置いてandoridページに表示しますが、今から理解すると、オブジェクトは事実上データの抽象体でしょう.ページ表示は通常xmlつまりビューでしょう.データはビューの形で表示されます.これがadapterの役割であり、対応する順序で表示することができます.対応する操作によってデータあるいはページの操作を行うことができて、それでは私のアダプタを見てみて、コードをつけます
これはbeanエンティティです
package com.example.fanyafeng.laugh.bean;
import com.example.fanyafeng.laugh.util.S;
/**
* Created by fanyafeng on 2015/6/30.
*/
public class IndexListViewBean extends BaseBean {
private String Title;
private String LeftTopImg;
private String LeftTopTitle;
private String LeftTopTimes;
private String LeftTopUrl;
private String RightTopImg;
private String RightTopTitle;
private String RightTopTimes;
private String RightTopUrl;
private String LeftBottomImg;
private String LeftBottomTitle;
private String LeftBottomTimes;
private String LeftBottonUrl;
private String RightBottomImg;
private String RightBottomTitle;
private String RightBottomTimes;
private String RightBottonUrl;
public IndexListViewBean(String title, String leftTopImg, String leftTopTitle, String leftTopTimes, String leftTopUrl, String rightTopImg, String rightTopTitle, String rightTopTimes, String rightTopUrl, String leftBottomImg, String leftBottomTitle, String leftBottomTimes, String leftBottonUrl, String rightBottomImg, String rightBottomTitle, String rightBottomTimes, String rightBottonUrl) {
Title = title;
LeftTopImg = leftTopImg;
LeftTopTitle = leftTopTitle;
LeftTopTimes = leftTopTimes;
LeftTopUrl = leftTopUrl;
RightTopImg = rightTopImg;
RightTopTitle = rightTopTitle;
RightTopTimes = rightTopTimes;
RightTopUrl = rightTopUrl;
LeftBottomImg = leftBottomImg;
LeftBottomTitle = leftBottomTitle;
LeftBottomTimes = leftBottomTimes;
LeftBottonUrl = leftBottonUrl;
RightBottomImg = rightBottomImg;
RightBottomTitle = rightBottomTitle;
RightBottomTimes = rightBottomTimes;
RightBottonUrl = rightBottonUrl;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getLeftTopImg() {
return LeftTopImg;
}
public void setLeftTopImg(String leftTopImg) {
LeftTopImg = leftTopImg;
}
public String getLeftTopTitle() {
return LeftTopTitle;
}
public void setLeftTopTitle(String leftTopTitle) {
LeftTopTitle = leftTopTitle;
}
public String getLeftTopTimes() {
return LeftTopTimes;
}
public void setLeftTopTimes(String leftTopTimes) {
LeftTopTimes = leftTopTimes;
}
public String getLeftTopUrl() {
return LeftTopUrl;
}
public void setLeftTopUrl(String leftTopUrl) {
LeftTopUrl = leftTopUrl;
}
public String getRightTopImg() {
return RightTopImg;
}
public void setRightTopImg(String rightTopImg) {
RightTopImg = rightTopImg;
}
public String getRightTopTitle() {
return RightTopTitle;
}
public void setRightTopTitle(String rightTopTitle) {
RightTopTitle = rightTopTitle;
}
public String getRightTopTimes() {
return RightTopTimes;
}
public void setRightTopTimes(String rightTopTimes) {
RightTopTimes = rightTopTimes;
}
public String getRightTopUrl() {
return RightTopUrl;
}
public void setRightTopUrl(String rightTopUrl) {
RightTopUrl = rightTopUrl;
}
public String getLeftBottomImg() {
return LeftBottomImg;
}
public void setLeftBottomImg(String leftBottomImg) {
LeftBottomImg = leftBottomImg;
}
public String getLeftBottomTitle() {
return LeftBottomTitle;
}
public void setLeftBottomTitle(String leftBottomTitle) {
LeftBottomTitle = leftBottomTitle;
}
public String getLeftBottomTimes() {
return LeftBottomTimes;
}
public void setLeftBottomTimes(String leftBottomTimes) {
LeftBottomTimes = leftBottomTimes;
}
public String getLeftBottonUrl() {
return LeftBottonUrl;
}
public void setLeftBottonUrl(String leftBottonUrl) {
LeftBottonUrl = leftBottonUrl;
}
public String getRightBottomImg() {
return RightBottomImg;
}
public void setRightBottomImg(String rightBottomImg) {
RightBottomImg = rightBottomImg;
}
public String getRightBottomTitle() {
return RightBottomTitle;
}
public void setRightBottomTitle(String rightBottomTitle) {
RightBottomTitle = rightBottomTitle;
}
public String getRightBottomTimes() {
return RightBottomTimes;
}
public void setRightBottomTimes(String rightBottomTimes) {
RightBottomTimes = rightBottomTimes;
}
public String getRightBottonUrl() {
return RightBottonUrl;
}
public void setRightBottonUrl(String rightBottonUrl) {
RightBottonUrl = rightBottonUrl;
}
@Override
public String toString() {
return "IndexListViewBean{" +
"Title='" + Title + '\'' +
", LeftTopImg='" + LeftTopImg + '\'' +
", LeftTopTitle='" + LeftTopTitle + '\'' +
", LeftTopTimes='" + LeftTopTimes + '\'' +
", LeftTopUrl='" + LeftTopUrl + '\'' +
", RightTopImg='" + RightTopImg + '\'' +
", RightTopTitle='" + RightTopTitle + '\'' +
", RightTopTimes='" + RightTopTimes + '\'' +
", RightTopUrl='" + RightTopUrl + '\'' +
", LeftBottomImg='" + LeftBottomImg + '\'' +
", LeftBottomTitle='" + LeftBottomTitle + '\'' +
", LeftBottomTimes='" + LeftBottomTimes + '\'' +
", LeftBottonUrl='" + LeftBottonUrl + '\'' +
", RightBottomImg='" + RightBottomImg + '\'' +
", RightBottomTitle='" + RightBottomTitle + '\'' +
", RightBottomTimes='" + RightBottomTimes + '\'' +
", RightBottonUrl='" + RightBottonUrl + '\'' +
'}';
}
}
これはアダプタです
package com.example.fanyafeng.laugh.adapter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v4.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.fanyafeng.laugh.R;
import com.example.fanyafeng.laugh.activity.VideoDisplayActivity;
import com.example.fanyafeng.laugh.activity.VideoListActivity;
import com.example.fanyafeng.laugh.activity.VideoViewPlayingActivity;
import com.example.fanyafeng.laugh.bean.IndexListViewBean;
import com.example.fanyafeng.laugh.bean.IndexUrlBean;
import com.example.fanyafeng.laugh.util.ImageLoaderCache;
import com.example.fanyafeng.laugh.util.L;
import com.example.fanyafeng.laugh.util.ListViewImageTaskUtil;
import com.example.fanyafeng.laugh.util.StringTools;
import com.example.fanyafeng.laugh.util.SyncImageLoader;
import java.util.List;
/**
* Created by fanyafeng on 2015/7/1.
*/
public class IndexListViewAdapter extends BaseAdapter {
private Context context;
private List indexListViewBeans;
private ListView listView;
// sd , ListView
private ImageLoaderCache mImageLoader;
//
private final int maxMemory = (int) Runtime.getRuntime().maxMemory();
//
private final int cacheSize = maxMemory / 5;
private LruCache mLruCache = new LruCache(
cacheSize) {
// sizeof()
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// TODO Auto-generated method stub
// kb
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
};
public IndexListViewAdapter(Context context, List indexListViewBeans) {
this.context = context;
this.indexListViewBeans = indexListViewBeans;
mImageLoader = new ImageLoaderCache(context);
}
public ImageLoaderCache getImagerLoader() {
return mImageLoader;
}
public void update() {
notifyDataSetChanged();
}
@Override
public int getCount() {
return indexListViewBeans.size();
}
@Override
public Object getItem(int position) {
return indexListViewBeans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.item_fragment_homepage, null);
holder = new ViewHolder();
view.setTag(holder);
holder.Title = (TextView) view.findViewById(R.id.index_title);
holder.LeftTopImg = (ImageView) view.findViewById(R.id.index_left_up_iv);
holder.LeftTopTitle = (TextView) view.findViewById(R.id.index_left_up_tv);
holder.LeftTopTimes = (TextView) view.findViewById(R.id.index_left_up_time);
holder.RightTopImg = (ImageView) view.findViewById(R.id.index_right_up_iv);
holder.RightTopTitle = (TextView) view.findViewById(R.id.index_right_up_tv);
holder.RightTopTimes = (TextView) view.findViewById(R.id.index_right_up_time);
holder.LeftBottomImg = (ImageView) view.findViewById(R.id.index_left_down_iv);
holder.LeftBottomTitle = (TextView) view.findViewById(R.id.index_left_down_tv);
holder.LeftBottomTimes = (TextView) view.findViewById(R.id.index_left_down_time);
holder.RightBottomImg = (ImageView) view.findViewById(R.id.index_right_down_iv);
holder.RightBottomTitle = (TextView) view.findViewById(R.id.index_right_down_tv);
holder.RightBottomTimes = (TextView) view.findViewById(R.id.index_right_down_time);
} else {
holder = (ViewHolder) view.getTag();
}
holder.LeftTopImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getLeftTopUrl());
L.d("leftTopUrl", indexListViewBeans.get(position).getLeftTopUrl());
L.d(" ", position);
context.startActivity(intent);
}
});
holder.RightTopImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getRightTopUrl());
context.startActivity(intent);
}
});
holder.LeftBottomImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getLeftBottonUrl());
context.startActivity(intent);
}
});
holder.RightBottomImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setClass(context, VideoViewPlayingActivity.class);
intent.putExtra("url_info", indexListViewBeans.get(position).getRightBottonUrl());
context.startActivity(intent);
}
});
holder.Title.setText(indexListViewBeans.get(position).getTitle());
holder.LeftTopTitle.setText(indexListViewBeans.get(position).getLeftTopTitle());
holder.LeftTopTimes.setText(indexListViewBeans.get(position).getLeftTopTimes());
holder.RightTopTitle.setText(indexListViewBeans.get(position).getRightTopTitle());
holder.RightTopTimes.setText(indexListViewBeans.get(position).getRightTopTimes());
holder.LeftBottomTitle.setText(indexListViewBeans.get(position).getLeftBottomTitle());
holder.LeftBottomTimes.setText(indexListViewBeans.get(position).getLeftBottomTimes());
holder.RightBottomTitle.setText(indexListViewBeans.get(position).getRightBottomTitle());
holder.RightBottomTimes.setText(indexListViewBeans.get(position).getRightBottomTimes());
loadBitmap(indexListViewBeans.get(position).getLeftTopImg(), holder.LeftTopImg);
loadBitmap(indexListViewBeans.get(position).getRightTopImg(), holder.RightTopImg);
loadBitmap(indexListViewBeans.get(position).getLeftBottomImg(), holder.LeftBottomImg);
loadBitmap(indexListViewBeans.get(position).getRightBottomImg(), holder.RightBottomImg);
return view;
}
private void loadBitmap(String urlStr, ImageView image) {
ListViewImageTaskUtil asyncLoader = new ListViewImageTaskUtil(image, mLruCache);//
Bitmap bitmap = asyncLoader.getBitmapFromMemoryCache(urlStr);//
if (bitmap != null) {
image.setImageBitmap(bitmap);// ImageView
} else {
image.setImageResource(R.drawable.wait);//
asyncLoader.execute(urlStr);// AsycnTask
}
}
static class ViewHolder {
TextView Title;
ImageView LeftTopImg;
TextView LeftTopTitle;
TextView LeftTopTimes;
ImageView RightTopImg;
TextView RightTopTitle;
TextView RightTopTimes;
ImageView LeftBottomImg;
TextView LeftBottomTitle;
TextView LeftBottomTimes;
ImageView RightBottomImg;
TextView RightBottomTitle;
TextView RightBottomTimes;
}
}
エンティティの書くこととアダプタの書くことに重点を置いて、それでは今私のエンティティの定義はデータでビューをマッピングするために使うだけではなくて、もう一つはとても重要なのはオブジェクトの上でデータをsetして、単一のitemは更に取りに行って、もとはブロガーはすべてのオブジェクトの中の4つのリンクの相応するbeanエンティティの中で、使うグローバル変数です(activityやfragmentをadapterと一緒に書くのはよくありません.なぜ私のところは簡単に会所して、詳しくは皆さんが体得して、まずコードが非常に乱れていること、そしてadapterの多重化、そしてグローバル変数が多いと1つはメンテナンスが悪いこと、1つは効率が低く、残りは本当に自分で理解しなければなりません)のlistデータは、getviewのpositionに基づいて対応するリンクを探したいのですが、positionを捕まえることでonitemonclickと合わないことに気づきました(この中のpositionは順次加算されています.そして唯一です).のpositionと同じです.この中で私が設定したのは、毎回3つをロードして、それから上に引っ張って他の多くをロードしてから3つをロードします.このようにすると、私が印刷したpositionは0から2のずっとの死の循環で、このように問題が来て、得た相応のリンクは間違いありません.そこでgetviewのpositionに従って取得しました.では、もう一度深く考えてみましょう.androidのgetviewのメカニズムは何ですか.なぜlistviewコントロールのデータの対応関係が間違っていないのか、混乱していないのか.これは面接官がよく聞く面接問題に関連しています.listviewがどのように最適化されているのか、見た資料はsettagです.そうです.これは、一般的なネット上の答えです.(しかし、これは答えの最適化があまりよくないような気がします.adapterでどのように事務を処理し、どのように処理するか、この方向が正しいはずです).しかし、このsettagはちょうど私たちの問題です.グーグルがくれたlistviewは、このviewが画面を描いたと仮定した後です.それではグーグルが処理します.この存在するviewは、再び戻ってくると仮定します.今の画面では、settagが機能し始めます.言い換えればif那です.elseを実行し始めました.ブロガーが処理している間にグローバルなlistを使い始めたばかりですが、これはよくありません.もう一つの効果が得られていません.そして、ブロガーはjavaのオブジェクト向けにbeanを設定する方法を考え始めました.はい、ブロガーはadapterでグローバルの変数を定義し、if elseの外で取得しました.しかし、onclickerlistenerはif elseの中にあります.この方法はさて、かなり远いブロガーが上记したように、それを実行する问题です.このような话はスクリーンのスライドやリフレッシュの中のグローバルなデータが乱れているに违いありません.きっと乱れています.その时、さらに深く掘り下げると、上记のようなものになります.データをバインドしてイベントの傍受を行い、対応するデータを取得することです.必要な効果です.そしてviewの表示もそうします.乱れていません.
ここでadapterがどのようにxmlにデータをマッピングするかについてお話ししますが、一般的にはまずholderを書きます.中にはitemのxmlに必要なものが入っていて、そこでlayoutを探して、それから対応するidを探しに行きます.それからholderと対応します(対応するbeanで定義されています.通常はページ表示が必要ですが、データのバックグラウンド操作は対応するレイアウトidを必要としません)また、adapterの中のいくつかのピットを強調します.
getviewのpositionは固定されたいくつかの値で、相対的に、グローバル変数として使用しないでください.
注意adapterがactivityを開くなど
リスニングイベントはifelse構造体に書かないでください.イベント処理も同じで、外に置いて単独で処理します.
結合に注意してください.そうしないとコードが乱れます.道理によってプログラム猿の論理的思考は非常にはっきりしているはずです.いつも一つの考えがあなたをデカップリングすることができます.しかし、どちらがいいですか.そして、あなたの処理方法に適しています.この点はプログラム猿の経験が必要です.残りはみんなで体験してください.ここは浅い分析だけです.