0

アイテムがテキストアイテムであるか、それに関連付けられた画像があるかどうかに基づいて、 s またはs のListViewいずれかで を構築しています。VewBinder を使用して SimpleCursorAdapter から表示されるカスタマイジング リストを使用しましたが、ある程度まではうまくいきました。TextViewImageView

SQLite databaseすべてにタイトル (テキスト) があるアイテムを含んでいますが、すべてのアイテムがリソースとして画像/ビデオを持っているわけではありません。そのため、純粋なテキスト アイテムもあれば、画像や動画のアイテムもあります。画像と動画についてはリソースを読み込みたいのですが、アイテムがプレーンテキストのアイテムの場合は、画像のタイトルを表示したいだけです。

つまり、テキスト アイテムのタイトルを表示するXML要素と、リソース ファイルを表示する要素です (動画の場合、動画 ID の YouTube の既定の画像を取得します)。TextViewImageView

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="6dp"
    android:background="@android:color/black"
    >


    <TextView
            android:id="@+id/tv_details_title"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:text="TextView"
            android:textColor="@android:color/white"
            android:visibility="visible"
            android:background="@android:color/holo_blue_bright"  />

    <ImageView
            android:id="@+id/iv_details_resource"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:adjustViewBounds="true"
            android:scaleType="centerInside"
            android:layout_gravity="center"
            android:src="@drawable/logo"
            android:visibility="visible"
            android:background="@android:color/holo_green_light" />
</LinearLayout>

Content Providerデータベースを使用するために他のアプリが必要ないため、使用していません。アイテムに関連付けられたリソースがあるかどうかに基づいて、データを にバインドSimpleCursorAdapterするCustomViewBinder(内部) クラスを使用し、作成しました。view

問題は、の可視性ImageViewが常に設定されてGONEいることです。そのため、常にTextView要素にバインドされているため、各アイテムのタイトルが表示されますが、データベースにリソースがリストされていない場合 (つまり、resourceフィールドのレコードに「null」がある場合)、ImageViewも消えます。

これが私のコードですCustomViewBinder

private class CustomViewBinder implements ViewBinder{
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex){
        if(columnIndex == cursor.getColumnIndex(DatabaseHelper.FIELD_RESOURCE)){
            Log.d("CustomViewBinder", "columnIndex = " + columnIndex);

            //If the column is resource, ten we use custom view.
            String resource = cursor.getString(columnIndex);
            Log.d("CustomViewBinder", "resource = " + resource);

            if(resource.equalsIgnoreCase("null")){
                Log.d("CustomViewBinder", "Inside if resource = " + resource);
                Log.d("CustomViewBinder", "Set the image view to GONE");
                view.setVisibility(View.GONE);
            }else{
                Log.d("CustomViewBinder", "Inside else resource = " + resource);
                columnIndex = cursor.getColumnIndex(DatabaseHelper.FIELD_TITLE);
                Log.d("CustomViewBinder", "columnIndex = " + columnIndex);

                //If the column is resource, ten we use custom view.    
                String title = cursor.getString(columnIndex);
                Log.d("CustomViewBinder", "title = " + title);

                if(!resource.equalsIgnoreCase("null")){
                    Log.d("CustomViewBinder", "Set the title view to GONE");
                    view.setVisibility(View.GONE);
                }
                return true;
            }
            return true;
        }
        return false;
    }

そして、明確にするためにいくつかのログ:

07-26 17:05:36.343: D/CustomViewBinder(9735): columnIndex = 4
07-26 17:05:36.343: D/CustomViewBinder(9735): resource = null
07-26 17:05:36.343: D/CustomViewBinder(9735): Inside if resource = null
07-26 17:05:36.343: D/CustomViewBinder(9735): Set the image view to GONE
07-26 17:05:36.353: D/CustomViewBinder(9735): columnIndex = 4
07-26 17:05:36.353: D/CustomViewBinder(9735): resource = null
07-26 17:05:36.353: D/CustomViewBinder(9735): Inside if resource = null
07-26 17:05:36.353: D/CustomViewBinder(9735): Set the image view to GONE
07-26 17:05:36.363: D/CustomViewBinder(9735): columnIndex = 4
07-26 17:05:36.363: D/CustomViewBinder(9735): resource = null
07-26 17:05:36.363: D/CustomViewBinder(9735): Inside if resource = null
07-26 17:05:36.363: D/CustomViewBinder(9735): Set the image view to GONE
07-26 17:05:53.770: D/CustomViewBinder(9735): columnIndex = 4
07-26 17:05:53.770: D/CustomViewBinder(9735): resource = Notes_Box_2_Notebook_1_006.jpg
07-26 17:05:53.770: D/CustomViewBinder(9735): Inside else resource = Notes_Box_2_Notebook_1_006.jpg
07-26 17:05:53.770: D/CustomViewBinder(9735): columnIndex = 2
07-26 17:05:53.770: D/CustomViewBinder(9735): title = Notebook page - man and wife
07-26 17:05:53.770: D/CustomViewBinder(9735): Set the title view to GONE
07-26 17:05:54.310: D/CustomViewBinder(9735): columnIndex = 4
07-26 17:05:54.310: D/CustomViewBinder(9735): resource = null
07-26 17:05:54.310: D/CustomViewBinder(9735): Inside if resource = null
07-26 17:05:54.310: D/CustomViewBinder(9735): Set the image view to GONE

問題は、" Set the title view to GONE" で " image view" がまだ に設定されてGONEいるため、画像 " Notes_Box_2_Notebook_1_006.jpg" が表示されないことです。タイトルは表示されます。

これは、 の " view" がではなく、常に私CustomViewBinderの中で であるように思われるためです。ImageViewXMLTextView

viewで「別の」にアクセスするにはどうすればよいCustomViewBinderですか?

4

1 に答える 1

0

ViewHolderパターンを使用しました。

Cursor拡張クラスを持つことで実装しました。私の主な活動では、データベースを照会するデータベース ヘルパー クラスからカーソルを取得します。次に、3 つのアイテム (aと 2 つの s) を保持CustomCursorAdapterする水平方向listviewにmy をリンクします。次に、水平に設定します。その後、何かをフィルタリングできますが、水平の上のメインを更新しただけです(リンクされたチュートリアルのように)。TextViewImageViewOnItemClickListenerlistviewviewlistview

CustomCursorAdapterの のgetView関数では、 を定義しViewHolder、(getView のパラメーターから) カーソルをその位置に移動し、getView関数のほぼすべての例で行われることを行います。

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
    ViewHolder holder = null;
    cursor.moveToPosition(position);

    if(convertView == null){
        convertView = inflater.inflate(R.layout.activity_media_items, null);            
        holder = new ViewHolder();

        holder.textview = (TextView) convertView.findViewById(R.id.tv_details_title);
        holder.imageview = (ImageView) convertView.findViewById(R.id.iv_details_resource_image);
        holder.imageviewvideo = (ImageView) convertView.findViewById(R.id.iv_details_resource_video);

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

    //////////////////////////TYPE      
    type = cursor.getString(cursor.getColumnIndex(DatabaseHelper.FIELD_ITEM_TYPE));
    itemId = cursor.getString(cursor.getColumnIndex(DatabaseHelper.FIELD_MEDIA_ITEM_ID));

    if(type.equalsIgnoreCase("text")){

        //////////////////////////TEXT
        String title = cursor.getString(cursor.getColumnIndex(DatabaseHelper.FIELD_TRANSCRIPTION));
        title = title.subSequence(0, 150) + "...";
        holder.textview.setText(title);

        holder.textview.setVisibility(View.VISIBLE);
        holder.imageview.setVisibility(View.GONE);
        holder.imageviewvideo.setVisibility(View.GONE); 
    }

    if(type.equalsIgnoreCase("image")){

        //////////////////////////IMAGE         
        String imageUri = "assets://";
        Log.d(TAG, "URI = " + imageUri + fileName);     

        ImageLoader.getInstance().displayImage(imageUri+fileName, holder.imageview);
        holder.textview.setVisibility(View.GONE);
        holder.imageview.setVisibility(View.VISIBLE);
        holder.imageviewvideo.setVisibility(View.GONE);         
    }

    if(type.equalsIgnoreCase("video")){

        //////////////////////////VIDEO 
        //get the file name
        String fileName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.FIELD_RESOURCE));

        //get the image of a youtube video because it's a video                                 
        try {
            Log.d(TAG,"Want to show video at -> http://img.youtube.com/vi/"+fileName+"/mqdefault.jpg");
            ImageLoader.getInstance().displayImage("http://img.youtube.com/vi/"+fileName+"/mqdefault.jpg", holder.imageviewvideo);
        } catch(Exception e) {
            Log.d("YouTube photo", "Failed to load photo!!! "+e.toString());
        }

        holder.textview.setVisibility(View.GONE);
        holder.imageview.setVisibility(View.GONE);
        holder.imageviewvideo.setVisibility(View.VISIBLE);
    }       
    return convertView;     
  }
于 2013-08-28T09:58:40.273 に答える