9

Tôi đang cố tạo một tùy chỉnh ArrayAdapter để sử dụng cho số ListFragment của mình. Hiện tại, không có gì được hiển thị trong số ListFragment ngoại trừ số TextView cho biết số Fragment là gì. Tôi đã đặt một breakpoint trong getView() phương pháp của bộ điều hợp của tôi và nó không được gọi. Tôi đã tìm kiếm các lý do không được gọi và một số người dường như nghĩ rằng ListView của tôi bị ẩn, vì vậy tôi đã thử thay đổi layout_height thành wrap_content, nhưng điều đó không hiệu quả.Custom ArrayAdapter trong một ListFragment

Ngoài ra, tôi đã làm theo các mã từ trang của nhà phát triển này: http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html

ListFragment:

public class HomeFragment extends ListFragment implements FragmentTitle 
{ 
private int mNum = 0; 
private String mTitle = "Home"; 
private ListView mListView; 
private MyArrayAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    InfoContainer temp = new InfoContainer("test1", "test2"); 
    mAdapter = new MyArrayAdapter(getActivity(), android.R.id.list, temp); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v1 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
    TextView tv = (TextView) v1.findViewById(R.id.text); 
    tv.setText("Fragment #" + mNum); 
    mListView = (ListView) v1.findViewById(android.R.id.list); 
    return v1; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 
    mListView.setAdapter(mAdapter); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) 
{ 
    Log.i("HomeFragment", "Item clicked: " + id); 
} 

public CharSequence getTitle() 
{ 
    return mTitle; 
} 

} 

ArrayAdapter:

public class MyArrayAdapter extends ArrayAdapter<InfoContainer> 
{ 
Context mContext; 
InfoContainer data; 

public MyArrayAdapter(Context context, int textViewResourceId, InfoContainer temp) 
{ 
    super(context, textViewResourceId); 
    mContext = context; 
    this.data = temp; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    ViewHolder holder = new ViewHolder(); 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); 
     row = inflater.inflate(R.id.pager, parent, false); 
     holder.v1 = (TextView) row.findViewById(R.id.listview_name); 
     holder.v2 = (TextView) row.findViewById(R.id.listview_data); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) row.getTag(); 
    } 
    InfoContainer info = data; 
    holder.v1.setText(info.name); 
    holder.v2.setText(info.text); 
    return row; 
} 

public static class ViewHolder 
{ 
    TextView v1; 
    TextView v2; 
} 

} 

fragment_pager_list.xml:

Tôi đã tạo các ArrayAdapters tùy chỉnh trước đó mà không có vấn đề gì, vì vậy có điều gì đó mà tôi thiếu trong việc làm cho chúng hoạt động với ListFragment?

Trả lời

6

Giải pháp là getCount() đã trả về 0 cho ArrayAdapter của tôi. Vì vậy, tôi chỉ sử dụng mAdapter.add(temp) và sau đó mAdapter.notifyDataSetChanged() và nó hoạt động. Tôi cũng phải thay đổi dòng row = inflater.inflate(R.id.pager, parent, false); thành row = inflater.inflate(R.layout.listview_row, parent, false);

+1

Cảm ơn. Tôi đã có cùng một vấn đề và nó đã thực sự trong getCount(). Hợp lý bởi vì lớp mở rộng không sử dụng các mục quá tải của bạn nên nó không biết kích thước của nó. –

Các vấn đề liên quan