2016-12-23 1 views
-1

FragmentBaseAdapter이라는 어댑터가 들어있는 코드를 작성하고 있습니다. 일부 항목을 어댑터에 추가하고 화면에 표시하려고합니다. 여기에 코드가 있습니다.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

thats wrong, 이미 존재하는 어댑터를보고 나중에 많은 시간을 절약 할 것입니다. – pskink

답변

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

대신 이렇게 :

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

무엇을 보여주고 있습니까? –

+0

화면이 여전히 비어 있고 흰색입니다. –

+0

private 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

봅니다 필요성이 유형의 배열 어댑터를 사용합니다. 사용자 정의에서 조건이 다시 유용성 보기 홀더 패턴을 사용해야하고 어댑터는 다음과 같아야합니다

/*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 –

관련 문제