2012-07-13 4 views
12

Tôi gặp sự cố rất lạ khi sử dụng ListView của mình.ListView không hiển thị tất cả các mục cho đến khi tương tác với

Chỉ một phần của các mục bộ điều hợp của tôi là renderd trong listview trên màn hình nhưng khi tôi tương tác với listview (tức là cố gắng cuộn nó) tất cả các mục được renderd đúng.

fenonemon này chỉ xảy ra nếu tôi có ít mục hơn màn hình có thể hiển thị. Hãy xem các ảnh chụp màn hình dưới đây.

Trước khi tương tác: enter image description here

Sau tương tác: Mã enter image description here

Nguồn hoạt động nơi thêm các mục:

String[] jRests = getResources().getStringArray(R.array.j_restaurants); 
     String[] lRests = getResources().getStringArray(R.array.l_restaurants); 

     items = new ArrayList<Object>(); 
     items.add(getString(R.string.campus_j)); 
     for(String item : jRests){ 
      String[] val = item.split(",,,"); 
      items.add(new FoodSectionListItem(new Restaurant(val[0], val[1], val[2], ""))); 
     } 
     items.add(getString(R.string.campus_l)); 
     for(String item : lRests){ 
      String[] val = item.split(",,,"); 
      items.add(new FoodSectionListItem(new Restaurant(val[0], val[1], val[2], ""))); 
     } 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     adapter = new BaseSectionAdapter(this, R.layout.list_item_fragment_header); 
     if(!isTabletView()){ 
      adapter.setSelectedItem(-1); 
     } 
     adapter.setItems(items); 

Mã adapter:

public class BaseSectionAdapter extends AmazingAdapter { 

    private LayoutInflater inflater; 
    private int selectedItem = 0; 
    private List<Object> items; 
    private List<SectionItem> sections = new ArrayList<SectionItem>(10); 
    private List<Class> itemTypes = new ArrayList<Class>(); 
    private List<Integer> sectionPositions = new ArrayList<Integer>(); 
    private int listHeaderLayoutId; 
    private View headerView; 

    public static interface ISectionListItem { 
     public void setProps(View convertView, int position, int selectedItem); 
     public View getLayout(LayoutInflater inflater); 
    } 

    private class SectionItem implements Serializable { 
     private static final long serialVersionUID = -8930010937740160935L; 
     String text; 
     int position; 

     public SectionItem(String text, int position) { 
      this.text = text; 
      this.position = position; 
     } 
    } 

    public BaseSectionAdapter(Context context, int listHeaderLayoutId) { 
     this.listHeaderLayoutId = listHeaderLayoutId; 
     init(context); 
    } 

    public BaseSectionAdapter(Context context, int listHeaderLayoutId, List<Object> listItems) { 
     this.listHeaderLayoutId = listHeaderLayoutId; 
     init(context); 
     initListItems(listItems); 
    } 

    private void init(Context context) { 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void setSelectedItem(int position) { 
     selectedItem = position; 
    } 

// public List<ListItem> getItems() { 
//  return items; 
// } 

    private void initListItems(List<Object> itemList) { 
     int curSection = -1; 
     //int curPosition = 0; 
     //curSection = 0; 

     this.items = itemList; 
     itemTypes.clear(); 
     sections.clear(); 
     sectionPositions.clear(); 



     int listSize = itemList.size(); 
     for(int i = 0; i < listSize; i++){ 
      Object currentItem = items.get(i); 
      if(currentItem instanceof String){ 
       sections.add(new SectionItem((String) currentItem,i)); 
       curSection++; 
      } 
      if(!itemTypes.contains(currentItem.getClass())){ 
       itemTypes.add(currentItem.getClass()); 
      } 


      sectionPositions.add(curSection); 
     } 

     Log.d("test", "No of items = "+items.size()); 
     Log.d("test", "No of itemtypes = "+itemTypes.size()); 
     Log.d("test", "View type count = "+getViewTypeCount()); 
    } 

    public void setItems(List<Object> itemList) { 
     initListItems(itemList); 
    } 

    public int getCount() { 
     return items==null?0:items.size(); 
    } 

    @Override 
    public int getViewTypeCount(){ 
     return (itemTypes.size() == 0)?1:itemTypes.size(); 
    } 

    @Override 
    public int getItemViewType(int position){ 
     return itemTypes.indexOf(items.get(position).getClass()); 
    } 

    @Override 
    public boolean isEnabled(int position){ 
     return !(items.get(position) instanceof String || items.get(position) instanceof EmptySectionListItem); 
    } 

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

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

    @Override 
    protected void onNextPageRequested(int page) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void bindSectionHeader(View view, int position, 
      boolean displaySectionHeader) { 
//  TextView lSectionTitle = (TextView) view 
//    .findViewById(R.id.txt_list_header); 
//  if (displaySectionHeader) { 
//   lSectionTitle.setVisibility(View.VISIBLE); 
//   lSectionTitle 
//     .setText(getSections()[getSectionForPosition(position)]); 
//  } else { 
//   lSectionTitle.setVisibility(View.GONE); 
//  } 
    } 

    @Override 
    public View getAmazingView(int position, View convertView, ViewGroup parent) { 
     Object curItemObject = items.get(position); 
     boolean isHeader = (curItemObject instanceof String); 

     if(convertView == null){ 
      if(isHeader && headerView != null){ 
       convertView = headerView; 
      }else if(isHeader){ 
       convertView = inflater.inflate(listHeaderLayoutId, null); 
       headerView = convertView; 
      }else{ 
       convertView = ((ISectionListItem) curItemObject).getLayout(inflater); 
      } 
     } 
     if(isHeader){ 
      TextView header = ((TextView)convertView.findViewById(R.id.txt_list_header)); 
      header.setText((String)curItemObject); 
     }else{ 
      ((ISectionListItem)curItemObject).setProps(convertView, position, selectedItem); 
     } 
     return convertView; 
    } 

    @Override 
    public void configurePinnedHeader(View header, int position, int alpha) { 

     TextView textView = ((TextView)header.findViewById(R.id.txt_list_header)); 
     textView.setText(getSections()[getSectionForPosition(position)]); 
    } 

    @Override 
    public int getPositionForSection(int section) { 
     if(section >= sections.size()){ 
      return 0; 
     } 

     return sections.get(section).position; 
    } 

    @Override 
    public int getSectionForPosition(int position) { 
     return sectionPositions.get(position); 
    } 

    @Override 
    public String[] getSections() { 
     String[] res = new String[sections.size()]; 
     for (int i = 0; i < res.length; i++) { 
      res[i] = sections.get(i).text; 

     } 
     return res; 
    } 
} 

Quy tắc bố trí:

LinearLayout layout = new LinearLayout(this); 
      layout.setOrientation(LinearLayout.HORIZONTAL); 

      FrameLayout listLayout = new FrameLayout(this); 
      LinearLayout.LayoutParams listParams = new LinearLayout.LayoutParams(0, FrameLayout.LayoutParams.MATCH_PARENT); 
      listParams.weight = 1; 
      listLayout.setId(LIST_FRAGMENT_VIEW_ID); 

      FrameLayout detailLayout = new FrameLayout(this); 
      LinearLayout.LayoutParams detailParams = new LinearLayout.LayoutParams(0, FrameLayout.LayoutParams.MATCH_PARENT); 
      detailParams.weight = 2; 
      detailLayout.setId(DETAIL_FRAGMENT_VIEW_ID); 

      layout.addView(listLayout, listParams); 
      layout.addView(detailLayout, detailParams); 

      if(savedInstanceState == null){ 

      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

      ft.add(listLayout.getId(), (Fragment) listFragment, TWO_PANEL_LIST_FRAGMENT_TAG); 
      ft.add(detailLayout.getId(), detailFragment); 
      ft.commit(); 

      } 
      setContentView(layout); 
+0

bạn có thể thêm một số mã bộ điều hợp không ..? – Kamal

+0

thêm mã nguồn nơi bạn đang thêm các mục vào nguồn dữ liệu sao lưu của danh sách xem của bạn và tạo bộ điều hợp –

+0

cũng hiển thị nguồn bố cục của ListView của bạn.:) –

Trả lời

1

Giải quyết nó !!!

Sự cố xảy ra với bộ điều hợp đang cố gắng sử dụng lại cùng một mục mục. Không tốt!!!

Thay đổi nó để làm tăng mục hàng mỗi lần chúng tôi nhấn một phần!

+1

bạn có thể vui lòng giúp tôi, tôi có cùng một vấn đề, bạn có thể giải thích cách giải quyết của bạn không? tôi phải bấm vào màn hình để tải listview –

+1

một câu trả lời thích hợp nên xây dựng làm thế nào để giải quyết vấn đề, không chỉ gợi ý nó. đặc biệt là nếu bạn trả lời câu hỏi của riêng bạn ... – ndori

0

tôi không biết những gì gây ra vấn đề, nhưng nếu bạn không tìm thấy một giải pháp hợp lý để nó, bạn có thể thử một cái gì đó như thế này:

  • kích hoạt một onTouchEvent() lập trình bất cứ khi nào bạn khởi chạy ListView.
  • cuộn xuống và sao lưu theo lập trình ngay sau khi Chế độ xem danh sách được khởi chạy.

vv ..

0

Thêm tiện ích vào ListView để Layout.xml và thêm nội dung của danh sách đó. Không sử dụng FrameLayout vì nó có thể là nguyên nhân của vấn đề. Nó đang cập nhật nội dung sau khi chạm để Bố cục trên đó không thực hiện thiết lập onCreate() chính xác như tiện ích ListView.

+0

ý của bạn là nó không triển khai đúng cách trênTạo? Im tạo bố cục theo chương trình, sau đó tôi thêm phân đoạn của mình vào. Đã cố gắng thay đổi hai FrameLayout thành LinearLayout, không có sự khác biệt:/ – Richard

+0

@Richard Bạn đang thêm một ListView ở đâu? Theo mã của bạn, bạn không thực hiện một ListView. – CommonKnowledge

+0

'ft.add (listLayout.getId(), (Fragment) listFragment, TWO_PANEL_LIST_FRAGMENT_TAG);' im thêm một liệt kê – Richard

0

Bạn có đang gọi phương thức notifyDataSetChanged() trên bộ điều hợp của mình sau khi thêm các mục mới không? Điều này làm cho listview làm mới chế độ xem của nó khi tập dữ liệu cơ bản được thay đổi.

Nếu vẫn không hoạt động, hãy thử notifyDataSetInvalidated() làm cho listview vẽ lại hoàn toàn.

+0

Đã thử cái này. Không có hiệu lực. Bắt đầu nghĩ rằng việc liệt kê danh sách có thể là vấn đề ở đây. Im thêm – Richard

5

thử gọi notifyDataSetChanged() trong phương thức runOnUIThread() như tôi đã hiển thị bên dưới và nó sẽ hoạt động như một nét duyên dáng. :)

   runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         messageAdapter.notifyDataSetChanged(); 
        } 
       }); 
+0

Rõ ràng không phải là giải pháp cho câu hỏi ban đầu, nhưng điều này giải quyết cùng một vấn đề đối với tôi. Gọi notificationDataSetChanged() từ một luồng khác không đáng tin cậy. – Ashley