2016-12-23 15 views
-1

Fragmentを含むコードを書いていますが、BaseAdapterという拡張アダプタが含まれています。私はいくつかの項目をアダプタに追加して、それらを画面上に表示しようとしています。ここにコードがあります。Android:アダプタが断片化していない

public class SettingsFragment extends Fragment { 

    private ListView lvSettings; 
    private SettingsAdapter settingsAdapter = new SettingsAdapter(); 

    private int[] icons = { 
      R.drawable.ic_developer 
    }; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_settings, null); 
     lvSettings = (ListView) view.findViewById(R.id.lvSettings); 
     lvSettings.setAdapter(settingsAdapter); 
     initializeAdapter(); 
     return view; 
    } 

    private void initializeAdapter() { 
     int size = icons.length; 
     SettingsItem[] settingsItems = new SettingsItem[size]; 
     for(int i=0; i<size; i++) { 
      settingsItems[i] = new SettingsItem(getActivity()); 
      settingsItems[i].setIcon(icons[i]); 
      settingsItems[i].setTitle(getResources().getStringArray(R.array.settings_items)[i]); 
      settingsAdapter.addItem(settingsItems[i]); 
     } 

     settingsAdapter.notifyDataSetChanged(); 
    } 

    private class SettingsAdapter extends BaseAdapter { 

     private ArrayList<SettingsItem> itemsList = new ArrayList<>(); 

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

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

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

     @Override 
     public View getView(int position, View view, ViewGroup viewGroup) { 

      return view; 
     } 

     public void addItem(SettingsItem item) { 
      itemsList.add(item); 
     } 
    } 

    private class SettingsItem { 
     private ImageView ivIcon; 
     private TextView tvTitle; 
     private LayoutInflater inflater; 

     SettingsItem(Context context) { 
      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.listitem_settings, null); 
      ivIcon = (ImageView) view.findViewById(R.id.ivSettingsItem); 
      tvTitle = (TextView) view.findViewById(R.id.tvSettingsItem); 
     } 

     public void setIcon(int icon) { 
      ivIcon.setImageResource(icon); 
     } 

     public void setTitle(String title) { 
      tvTitle.setText(title); 
     } 
    } 
} 

このコードを実行しましたが、画面に何も表示されません。リスト項目を画面に表示するには、このコードをどのように変更する必要がありますか?

+0

なぜカスタムアダプターですか?どうして 'ArrayAdapter'はどうですか? – pskink

+0

私はこれまでに 'BaseAdapter'を使用することに慣れているので、 –

+1

は間違っています。既に存在するアダプターを参照すると、将来は多くの時間を節約します – pskink

答えて

0
lvSettings.setAdapter(settingsAdapter); 
     initializeAdapter(); 

代わりにこれを行う:

initializeAdapter(); 
    lvSettings.setAdapter(settingsAdapter); 
+0

何が表示されていますか? –

+0

空白の白い画面。 –

+0

プライベートArrayList itemsList =新しいArrayList <>();これは空に戻ります。 –

3

あなたは)(getViewメソッドで何もしませんので。

@Override public View getView(int position, View view, ViewGroup viewGroup) { //do something here View view = LayoutInflater.from(context).... TextView tv =view.findView.... Item item = list.get(position); tv.set.... return view; }

+0

アイテムビューを再利用していないので完璧な解決策ではありません... – pskink

+0

私が知っている@pskink私は間違った場所を指摘するだけです。 – LeeYaochi

+1

大丈夫ですが、既に存在するadpatersが – pskink

0

必要性のこのタイプの配列アダプタを使用してみてください。カスタム条件でビューホルダーを使用する必要があります再利用性およびアダプタのパターンは次のようになります。あなたは、あなたが、私は非常にシンプル見つけるこのチュートリアルを通過することができますAndroidに新しいしている場合

/*private view holder class*/ 
private class ViewHolder { 
    ImageView imageView; 
    TextView txtTitle; 
    TextView txtDesc; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    LayoutInflater mInflater = (LayoutInflater) 
     context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, null); 
     holder = new ViewHolder(); 
     holder.txtDesc = (TextView) convertView.findViewById(R.id.desc); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    RowItem rowItem = (RowItem) getItem(position); 

    holder.txtDesc.setText(rowItem.getDesc()); 
    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.imageView.setImageResource(rowItem.getImageId()); 

    return convertView; 
} 

http://theopentutorials.com/tutorials/android/listview/android-custom-listview-with-image-and-text-using-baseadapter/

3

は、このコードを使用します。

public class SettingsFragment extends Fragment { 

    private ListView lvSettings; 
    private SettingsAdapter settingsAdapter; 
    private ArrayList<SettingsItem> alsettingsItems; 
    private int[] icons = { 
      R.drawable.ic_developer 
    }; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_sms, null); 
     lvSettings = (ListView) view.findViewById(R.id.lvSettings); 
     initializeAdapter(); 
     settingsAdapter=new SettingsAdapter(alsettingsItems,getActivity()); 
     lvSettings.setAdapter(settingsAdapter); 
     return view; 
    } 

    private void initializeAdapter() { 
     int size = icons.length; 
     alsettingsItems = new ArrayList<>(); 
     final SettingsItem settings_items= new SettingsItem(); 
     for (int i = 0; i < size; i++) { 
      settings_items.setIvIcon(icons[i]); 
      settings_items.setTvTitle(getResources().getStringArray(R.array.settings_items)[i]); 
      alsettingsItems.add(settings_items); 
     } 

     settingsAdapter.notifyDataSetChanged(); 
    } 

    public class SettingsAdapter extends BaseAdapter { 

     private ArrayList<SettingsItem> itemsList = new ArrayList<>(); 
     private Context context; 
     private ViewHolder viewHolder; 

     public SettingsAdapter(ArrayList<SettingsItem> itemsList, Context context) { 
      this.context = context; 
      this.itemsList = itemsList; 
     } 

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

     @Override 
     public Object getItem(int i) { 
      return itemsList.get(i); 
     } 

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

     @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
     @Override 
     public View getView(int i, View convertView, final ViewGroup viewGroup) { 
      View view = convertView; 
      if (view == null) { 
       LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = li.inflate(R.layout.listitem_settings, null); 
      } else { 
       view = convertView; 
      } 

      viewHolder = new ViewHolder(view); 

      final SettingsItem data = itemsList.get(i); 
      viewHolder.ivIcon.setImageResource(data.getIvIcon()); 
      viewHolder.tvTitle.setText(data.getTvTitle()); 
      view.setTag(data); 
      return view; 
     } 

     private class ViewHolder { 
      private ImageView ivIcon; 
      private TextView tvTitle; 

      ViewHolder(final View view) { 
       ivIcon = (ImageView) view.findViewById(R.id.ivSettingsItem); 
       tvTitle = (TextView) view.findViewById(R.id.tvSettingsItem); 
      } 
     } 


    } 
    public class SettingsItem{ 
     private Integer ivIcon; 
     private String tvTitle; 


     public String getTvTitle() { 
      return tvTitle; 
     } 

     public void setTvTitle(String tvTitle) { 
      this.tvTitle = tvTitle; 
     } 

     public Integer getIvIcon() { 
      return ivIcon; 
     } 

     public void setIvIcon(Integer ivIcon) { 
      this.ivIcon = ivIcon; 
     } 
    } 
} 

あなたが望む通りに動作します。

+1

に利用できる場合、間違った場所が 'BaseAdapter'を拡張しています。 :) @NilayDani –

関連する問題