テキストビューを含むカスタムリストビューを使用しているプロジェクトを行っています。サーバーからデータが来ています。データサイズに基づいて、セルの高さを変更したい。コンテンツが 2 行を超える場合は、2 行にトリミングして、[もっと見る] ボタンを表示する必要があります。[もっと見る] ボタンをクリックすると、セルが展開されて詳細が表示されます。しかし、役立つリソースが見つかりません。これを解決するのに役立つリンクや提案はありますか?
1 に答える
これを行う1つの方法は、最初にlistViewを無効にして、表示されている要素を再描画するように強制し、次にアダプターのgetViewメソッドでレイアウトの変更を処理することです。
これを試してください:
showTrimmed(int position、boolean value)メソッドをアダプターに追加します。これにより、トリミングするまたはトリミングしないリストアイテムを追跡するアダプタ内の構造が更新されます。次に、getViewメソッドで、アイテムビューを作成するときに、現在の要素をトリミングする必要があるかどうかをテストし、その結果に基づいて適切なビューを作成します。私は異なるが同様の結果を達成するために同様のことをしました、そしてそれはうまくいきます。showTrimmedを呼び出した後、invalidateを呼び出して、listViewに表示されたアイテムを強制的に再描画することを忘れないでください。
編集:私はあなたがやりたいこととは異なる私のコードを投稿しますが、それはアイデアにおいて非常に似ています:
public class HeroListViewAdapter extends ArrayAdapter<Hero> {
public static int NO_POS = -1;
private List<Hero> heroes;
private int selected_pos = NO_POS;
public HeroListViewAdapter(Context context, List<Hero> heroes){
super(context, R.layout.hero_list_item_view, heroes);
this.heroes = heroes;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false);
if(position == selected_pos){
rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color)));
}
return rowView;
}
public void setSelectedPosition(int selected_pos){
this.selected_pos = selected_pos;
}
public int getSelectedPosition(){
return selected_pos;
}
public Hero getSelectedHero(){
if(selected_pos>=0 && selected_pos<heroes.size())
return this.getItem(selected_pos);
else
return null;
}
}
setSelectedPositionの代わりに、すべてのリストアイテムのトリミングされた状態を追跡するために、setSelectedPosのように内部メンバーを更新するshowTrimmedメソッドが必要です。次に、getViewメソッドでテストを実行し(if(position == selected_pos)で行うように)、テストの結果に基づいてカスタムのトリミング済みまたは未トリミングのリストアイテムを作成します。これらの関数を使用する私のリスナーは次のとおりです。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
list_adapter.setSelectedPosition(position);
listView.invalidate();
}
}
);
このアイデアをニーズに合わせて更新してみることができます。特に私の場合、プログラムで背景を変更することにより、クリックされたリストビューアイテムを強調表示するためにこれを行います。