2012-02-22 7 views
0

ffと似たプロジェクトを作成する必要があります。写真。 (私は恥ずかしがり屋の使用のために私の謝罪、私はすぐに利用できるものとする必要があります)。
enter image description here左側のImageViewを使用した複数行リストビュー


私は私が何をしたか言わないだろう「動的」リストビューを作成するには最良の方法だったんだけど、私は現在の仕事を持っているもの作るために喜んでいると思います。次のようにとにかく私の実装は次のとおりです。

public class MultiLineListViewActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ArrayList<SearchResults> searchResults = getSearchResults(); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(new MyCustomBaseAdapter(this, searchResults)); 
} 

private ArrayList<SearchResults> getSearchResults() { 
    ArrayList<SearchResults> results = new ArrayList<SearchResults>(); 

    SearchResults sr1 = new SearchResults(); 
    sr1.setName("Name 1"); 
    sr1.setPhone("12345"); 
    SearchResults.setIcon(R.drawable.pic_one); 
    results.add(sr1); 

    sr1 = new SearchResults(); 
    sr1.setName("Name 2"); 
    sr1.setPhone("123456"); 
    SearchResults.setIcon(R.drawable.pic_two); 
    results.add(sr1); 

    ... 

    return results; 
} 
} 


パブリッククラスにsearchResults {

private String name; 
private String phone; 
public static ArrayList<Integer> iconsList = new ArrayList<Integer>(); 

public void setName(String name) { 
    this.name = name; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public static void setIcon(int i) { 
    iconsList.add(i); 
} 

public String getName() { 
    return this.name; 
} 

public String getPhone() { 
    return this.phone; 
} 
} 


public class MyCustomBaseAdapter extends BaseAdapter { 

private ArrayList<SearchResults> searchArrayList; 
private LayoutInflater layoutInflater; 
private Context context; 

public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) { 
    this.searchArrayList = results; 
    //this.context = context; 
    layoutInflater = LayoutInflater.from(context); 
} 

@Override 
public int getCount() { 
    return searchArrayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return searchArrayList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    ImageView imageView; 

    if(convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.custom_row_view, null); 

     holder = new ViewHolder(); 
     holder.txtName = (TextView) convertView.findViewById(R.id.name); 
     holder.txtPhone = (TextView) convertView.findViewById(R.id.phone); 

     imageView = new ImageView(context); 

     convertView.setTag(holder); 
    } 
    else { 
     //imageView = (ImageView) convertView; 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    imageView = new ImageView(context); 
    imageView.setImageResource(SearchResults.iconsList.get(position)); 

    holder.txtName.setText(searchArrayList.get(position).getName()); 
    holder.txtPhone.setText(searchArrayList.get(position).getPhone()); 

    return convertView; 
} 

class ViewHolder { 
    TextView txtName; 
    TextView txtPhone; 
} 


上記のコードは名前を表示することに成功したとPhone ListView内の行、それは私に '強制終了'を与えているイメージの追加です。

コメント行に注意してください。imageView =(ImageView)convertView; コメントを削除するとアプリがクラッシュするという点で、特定の行に減らしました。

答えて

3

注:StackOverflowの質問で尋ねている強制終了を得るたびに、完全なスタックトレースを投稿してください。

新しいImageViewを作成するのは、実際に作成する必要がない場合です。これはTextViewのように、カスタムアイテムレイアウトで定義する必要があります(これはおそらくこの場合も投稿する必要があります)。同じ方法でfindViewByIdを使用して取得することができます。

+0

あなたの提案は現場にあった! ImageViewをlayout.custom_row_view.xmlに追加して、getView()内のimageViewのすべての宣言とインスタンス化を削除したと言ったように、LinearLayouts(RelativeLayoutも同様に)を入れ子にして、例のようなビューを配置しました..そしてviola !ありがとうございました! –

3

kabukoはどちらも当てはまります。 (私の推測では、layout/custom_row_viewはLinearLayoutなので、コメント行はLinearLayoutをImageViewに強制しようとします。そうすれば例外が発生します。また、あなたのViewHolderクラスがちょうどそう...

// Assuming that layout/custom_row_view is a LinearLayout... 
getView(yadda) { 
    LinearLayout row; 
    ImageView imageView; 
    TextView txtName, txtPhone; 

    if (convertView == null) { 
     row = // inflate a new one 
    } else { 
     row = // get the old one 
    } 

    // fetch the views 
    imageView = row.findViewById(...); 
    txtName = row.findViewById(...); 
    txtPhone = row.findViewById(...); 

    // fill the views 
    imageView.setImageResource(...); 
    txtName.setContent(...); 
    txtPhone.setContent(...); 

    return row; 
} 

CiaoのようなあなたのgetView()に変数としてそれらTextViewsを定義し、不必要です。

+1

'ViewHolder'クラスは実際には有効なパフォーマンス強化です。 'findViewById'は必ずしも安いわけではありません。時には、その処理を節約するために少しだけメモリを消費する価値があります。例については、[this](http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html)を参照してください。 – kabuko

関連する問題