2017-01-06 5 views
0

アセットフォルダに多数のイメージを追加し、そこからイメージを取得してListViewに追加したいとします。 私はアプリを実行しているが、すべてが完璧だが、リストビューのイメージコンテナは空白(透明)で表示されます。 OutputアセットからDrawableをListViewに追加する

Javaファイル:

package com.basil.victor; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import java.io.IOException; 
import java.io.InputStream; 

public class Events extends Fragment { 

private ListView listEvent; 

String eventname[]={ 
     "Name", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

String eventlogoname[]={ 
     "Logo", 
     "name", 
     "of", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

Drawable[] arr=new Drawable[7]; 

String eventsubtitle []={ 
     "Subtitles", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_events, null); 



    for(int i=0;i<7;i++) { 
     try { 
      InputStream stream = getContext().getAssets().open(eventlogoname[i] + ".jpg"); 
      Drawable el = Drawable.createFromStream(stream, null); 
      arr[i] = el; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    EventList adapter = new 
      EventList(getActivity(), eventname, arr, eventsubtitle); 
    //ListView lv = (ListView)rootView. 
    listEvent=(ListView)view.findViewById(R.id.listEvent); 
    listEvent.setAdapter(adapter); 


    return view; 
} 
} 

ListViewコントロールアダプタ:

package com.basil.victor; 
import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class EventList extends ArrayAdapter<String>{ 

private final Activity context; 
private final String[] title; 
private final Drawable[] banner; 
private final String[] subtitle; 
public EventList(Activity context, 
        String[] title, Drawable[] banner, String[] subtitle) { 
    super(context, R.layout.list_single, title); 
    this.context = context; 
    this.title = title; 
    this.banner = banner; 
    this.subtitle = subtitle; 

} 
@Override 
public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView= inflater.inflate(R.layout.event_row, null, true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner); 
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle); 


    txtTitle.setText(title[position]); 
    imageView.setImageDrawable(banner[position]); 
    subTitle.setText(subtitle[position]); 


    return rowView; 
} 
} 
+0

ほとんどの場合、正しく読み込まれていない可能性があり、ヌルの配列を渡す可能性があります。あなたはデバッガで歩き回って、どこが失敗しているのか探していますか? –

+0

デバッガはこう言います: java.io.FileNotFoundException:Logo.jpg –

+0

アセットフォルダに存在します –

答えて

1

画像は、資産のサブフォルダ内にある場合はFileNotFound Exception

  1. チェックを取得している場合は、適切なパスを追加し

  2. (拡張子のケースを確認してください画像が.JPG(大文字)の拡張子を持っていることを認識するまで、この問題に長時間遭遇しました。

  3. 最終的な検索対象の文字列ランダム空白のため

+0

はい、それはサブフォルダのバナーの中にあります。だから、何が@ハランがあなたに教えることができる道になるでしょう –

+0

ありがとう。画像はサブフォルダの中に入っていたので、次の行のいずれかに変更しました。 InputStream stream = getContext()。getAssets()。open( "banners /" + eventlogoname [i] + ".jpg"); –

+0

申し訳ありませんが、これを見ました。それはうまくいった! –

0

画像の資産フォルダを使用しているのはなぜ?

package com.basil.victor; 
import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class EventList extends ArrayAdapter<String>{ 

private final Activity context; 
private final String[] title; 
private final int[] banner; 
private final String[] subtitle; 
public EventList(Activity context, 
        String[] title, int[] banner, String[] subtitle) { 
    super(context, R.layout.list_single, title); 
    this.context = context; 
    this.title = title; 
    this.banner = banner; 
    this.subtitle = subtitle; 

} 
@Override 
public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView= inflater.inflate(R.layout.event_row, null, true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner); 
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle); 


    txtTitle.setText(title[position]); 
imageView.setImageResource((banner[position]); 
    subTitle.setText(subtitle[position]); 


    return rowView; 
} 
} 
+0

いいえ私はアセットを使いたいです。私はdrawableで行う方法を知っているので、資産で試してみたい –

0

この

class MainActivity extends AppCompatActivity { 
private ListView listEvent; 


String arras[]={ 
    "Logo", 
    "name", 
    "of", 
    "events", 
    "are", 
    "present", 
    "here" 
}; 
Drawable[] arr=new Drawable[5]; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
      EventList adapter = new EventList(MainActivity.this, arras); 
      //ListView lv = (ListView)rootView. 
      listEvent=(ListView)findViewById(R.id.listEvent); 
      listEvent.setAdapter(adapter); 



     } 
    } 

とアダプタクラスのようにそれを実行します。それは必要ではない場合、あなたはすべての描画可能なフォルダ内の画像や

package com.basil.victor; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import java.io.IOException; 
import java.io.InputStream; 

public class Events extends Fragment { 

private ListView listEvent; 

String eventname[]={ 
     "Name", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 



int[] arr=new int[7]; 

String eventsubtitle []={ 
     "Subtitles", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_events, null); 

arr[]={ 
      R.drawable.Logo, 
      R.drawable.name, 
      R.drawable.of, 
      R.drawable.events, 
      R.drawable.are, 
      R.drawable.present, 
      R.drawable.here 
    }; 



    EventList adapter = new 
      EventList(getActivity(), eventname, arr, eventsubtitle); 
    //ListView lv = (ListView)rootView. 
    listEvent=(ListView)view.findViewById(R.id.listEvent); 
    listEvent.setAdapter(adapter); 


    return view; 
} 
} 

アダプタは同じプットのために描画可能なを使用することができますこのようなもの

public class EventList extends BaseAdapter { 
LayoutInflater inflater; 
private final Activity context; 
String arras[]; 
public EventList(Activity context,String[] arras) { 
    super(); 
    this.context = context; 
    this.arras = arras; 
    inflater = (LayoutInflater) this.context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

} 
@Override 
public int getCount() { 
    return arras.length; 
} 

@Override 
public Object getItem(int position) { 
    return arras.length; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 
@Override 
public View getView(int position, View myView, ViewGroup parent) { 
    if (myView == null) { 
     myView = inflater.inflate(R.layout.event_row, null, true); 

    } 

    ImageView imageView = (ImageView) myView.findViewById(R.id.event_banner); 
    try { 
     InputStream stream = context.getAssets().open(arras[position] + ".jpg"); 
     Drawable el = Drawable.createFromStream(stream, null); 
     imageView.setImageDrawable(el); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    return myView; 
} 

}

0

使用ViewHolder

ViewHolderは、ビューをキャッシュすることで、より速くロードするリストビューを作成します。 findViewById()を呼び出すたびにビューを参照すると、非常に遅くなります。

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder; // to reference the child views for later actions 

     if (v == null) { 
      LayoutInflater vi = 
        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.mainrow, null); 
      // cache view fields into the holder 
      holder = new ViewHolder(); 
      holder.ImageView = (ImageView) v.findViewById(R.id.event_banner); 
      // associate the holder with the view for later lookup 
      v.setTag(holder); 
     } else { 
      // view already exists, get the holder instance from the view 
      holder = (ViewHolder) v.getTag(); 
     } 
     // no local variables with findViewById here 

     // use holder.ImageView where you were 
     // using the local variable nameText before 
     try { 
      InputStream stream = context.getAssets().open(arras[position] + ".jpg"); 
      Drawable el = Drawable.createFromStream(stream, null); 
      holder.ImageView.setImageDrawable(el); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return v; 
    } 

// somewhere else in your class definition 
static class ViewHolder { 
    ImageView imageView; 
} 
関連する問題