0

私は、異なるスタイルのアイテムを含むリストビュー、日付を含むヘッダースタイル (黒)、およびその日付のアイテムのアイテムスタイルを持っています。

今、下にスクロールすると、情報が正しい項目にありません。タイトルが黒いバーに表示されることもあれば、日付がアイテム スタイルに表示されることもあります。

また、画像は正しくありません。私が構築していたアプリでこのようなリストビューアダプターを使用していますが、これは一度もありませんでした。単一のリストビューで異なるレイアウトを操作するのは初めてです。

画像の読み込みには Aquery を使用します。

私の間違いを指摘してください。

グレイシングス

ここに画像の説明を入力

バインダー Java

public class BinderData_TvGids extends BaseAdapter {
    LayoutInflater inflater;
    List<HashMap<String,String>> TvGids;
    ViewHolder holder;

    public BinderData_TvGids() {}

    public BinderData_TvGids(Activity act, List<HashMap<String, String>> map) {
        this.TvGids = map;
        inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return TvGids.size();
    }

    public Object getItem(int arg0) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        File ext = Environment.getExternalStorageDirectory();
        File cacheDir = new File(ext, "/android/data/apk/case");
        AQUtility.setCacheDir(cacheDir);
        AQuery aq = new AQuery(convertView);

        ViewHolder holder = null;
        View vi=convertView;
        if(TvGids.get(position).get("header").equals("true")) { //headers worden meegegeven uit array, deze krijgen een apparten layout
            if (convertView == null) {
                vi = inflater.inflate(R.layout.list_row_tvgids_header, null);
                holder = new ViewHolder();
                holder.titel = (TextView) vi.findViewById(R.id.titel); // naam
                vi.setTag(holder);
            } else {
                holder = (ViewHolder) vi.getTag();
            }
            if (holder.titel != null)
                holder.titel.setText(TvGids.get(position).get("datum")); // naam
            return vi;
        } else {
            if (convertView == null) {
                vi = inflater.inflate(R.layout.list_row_tvgids, null);
                holder = new ViewHolder();
                holder.poster =(ImageView)vi.findViewById(R.id.poster); // poster
                holder.zenderlogo =(ImageView)vi.findViewById(R.id.ZenderLogo); // poster
                holder.titel = (TextView) vi.findViewById(R.id.titel); // naam
                holder.starttijd = (TextView) vi.findViewById(R.id.starttijd); // naam
                holder.loader =(ProgressBar)vi.findViewById(R.id.progress); // progressbar
                vi.setTag(holder);
            } else {
                holder = (ViewHolder) vi.getTag();
            }

            if (holder.poster != null & holder.loader != null)
                    if(!TvGids.get(position).get("film_key").contains("TV") && !TvGids.get(position).get("film_key").contains("BS")) {
                        holder.poster.setVisibility(View.INVISIBLE);
                        aq.id(holder.poster).progress(holder.loader).image("http://cdn.be/hosting/movie/" + TvGids.get(position).get("film_key") + "/null/200/poster.jpg", false, true, 0, R.drawable.poster_x, null, AQuery.FADE_IN_NETWORK);
                    } else {
                        holder.loader.setVisibility(View.INVISIBLE);
                    }
            if (holder.zenderlogo != null)
                aq.id(holder.zenderlogo).image("http://cdn.be/hosting/zender/rw.php?zender=" + TvGids.get(position).get("zender") + "&size=166&opacity=50", false, true, 0, 0, null, AQuery.FADE_IN);
            if (holder.starttijd != null)
                holder.starttijd.setText(TvGids.get(position).get("starttijd")); // naam
            if (holder.titel != null)
                holder.titel.setText(TvGids.get(position).get("titel")); // naam
            return vi;
        }
    }

    static class ViewHolder{
        TextView starttijd;
        TextView titel;
        ImageView poster;
        ImageView zenderlogo;
        ProgressBar loader;
    }
}
4

2 に答える 2

0

BaseAdapter の をオーバーライドしてくださいgetItemViewType()
そして、次のコードを試してください。

public int getItemViewType (int position) {
    if(TvGids.get(position).get("header").equals("true")){
        return 0;
    }else{
        return 1;
    }
}
于 2016-01-03T19:01:45.517 に答える
0

現在、ListView はヘッダーと通常のアイテムの違いを認識していません。すべてのアイテムが同じであると考えています。convertViewこれにより、実際にビューのリサイクルを開始したときに問題が発生します。.

次の戦略のいずれかを実行する必要があります。

  1. とを使用getItemViewType()getViewTypeCount()ます。これらのメソッドListViewを使用すると、さまざまなアイテム タイプが存在することがわかり、正しくリサイクルされますがgetCount()、アイテムの数とヘッダーの数を返す必要があります (現在の実装でこれが行われるかどうかはわかりません)。これについて詳しく説明しているThe World of ListViewというビデオを参照してください。

  2. 通常のアイテムのレイアウト XML にヘッダーを配置し、このレイアウトのみを使用します。デフォルトでヘッダーを表示GONEします。アイテムにヘッダーを表示する必要がある場合は、ヘッダーの可視性を に設定しVISIBLEます。これは、ビュー階層にいくつかの余分なビューを持つことを犠牲にして、すべてのリスト項目に 1 つのレイアウトを使用します。

基本的に、#1 は 2 つの異なるタイプのリスト アイテムを正しく実装しますが、#2 はリスト アイテムを実際には同じアイテムにすることで反対のことを行います。


別の方法があります。代わりにRecyclerViewan を使用してヘッダーを使用および実装します。ItemDecorationこれについては、各自で調べてください。

于 2016-01-03T19:01:54.267 に答える