1

두 개의 조각이 있으며 배열 어댑터와 함께 해당 범주를 표시합니다. 첫 번째 조각은 표시 항목 범주이고 두 번째 조각은 표시 작업 범주입니다. 그러나 두 조각 모두에 작업 범주가 표시됩니다. 나는 어떤 부분이 잘못 될지 모른다.Android ArrayAdapter getView가 올바른 위치를 가져올 수 없습니다.

사용자가 해당 탭을 선택할 때 조각을 표시하는 것은 내 ViewPager입니다. setCategory()는 데이터베이스에서 데이터를 수신 할 때 호출됩니다.

public class ViewPagerAdapter extends FragmentPagerAdapter { 

private List<Category> categoryList = new ArrayList(); 
private DisplayItemFragment itemFragment; 
private DisplayJobFragment jobFragment; 

public ViewPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    Log.d("categoryList", categoryList.size()+" "); 
    if (position ==0) { 
     itemFragment = new DisplayItemFragment(categoryList); 
     return itemFragment; 
    }else{ 
     jobFragment = new DisplayJobFragment(categoryList); 
     return jobFragment; 
    } 

} 

@Override 
public int getCount() { 
    return 2; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    switch (position){ 
     // 
     //Your tab titles 
     // 
     case 0:return "Item"; 
     case 1:return "Job"; 
     default:return null; 
    } 
} 

public void setCategory(List<Category> list){ 
    List<Category> tempList = new ArrayList(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("item")){ 
      tempList.add(list.get(i)); 
     } 
    } 
    itemFragment.update(tempList); 
    Log.d("this.categoryListitem",tempList.size()+""); 
    tempList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("job")){ 
      tempList.add(list.get(i)); 
     } 
    } 
    jobFragment.update(tempList); 
    Log.d("this.categoryListjob",tempList.size()+""); 
} 
} 

은 조각이 두 조각이있는 gridview에 범주를 표시 할 CategoryGridAdapter라고합니다

public class DisplayJobFragment extends Fragment { 

private View rootView; 
private GridView gridView; 
private List<Category> categoryList; 
private DisplayFragmentPresenter presenter; 
private TextView text; 
private CategoryGridAdapter categoryAdapter; 

public DisplayJobFragment(List<Category> categoryList) { 
    this.categoryList=categoryList; 
} 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    rootView = inflater.inflate(R.layout.fragment_display, container, false); 
    text = (TextView) rootView.findViewById(R.id.test); 
    categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, categoryList); 
    gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setAdapter(categoryAdapter); 
    gridView.setTextFilterEnabled(true); 

    //Log.d("category",categoryList.get(0).getName()); 
    return rootView; 
} 

public void update(List<Category> list) { 
    this.categoryList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("job")){ 
      this.categoryList.add(list.get(i)); 
     } 
    } 
    text.setText("job refresh"); 
    //categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, this.categoryList); 
    for(int i=0;i<this.categoryList.size();i++){ 
     Log.d("categoryListjob",categoryList.get(i).getName()); 
    } 

} 
} 

직종 표시하는 단편 항목 범주를

public class DisplayItemFragment extends Fragment { 

private View rootView; 
private GridView gridView; 
private List<Category> categoryList; 
private DisplayFragmentPresenter presenter; 
private CategoryGridAdapter categoryAdapter; 
private TextView text; 

public DisplayItemFragment(List<Category> categoryList) { 
    this.categoryList=categoryList; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    rootView = inflater.inflate(R.layout.fragment_display, container, false); 
    text = (TextView) rootView.findViewById(R.id.test); 
    categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, categoryList); 
    gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setAdapter(categoryAdapter); 
    gridView.setTextFilterEnabled(true); 

    //Log.d("category",categoryList.get(0).getName()); 
    return rootView; 
} 

public void update(List<Category> list) { 
    this.categoryList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("item")){ 
      this.categoryList.add(list.get(i)); 
     } 
    } 
    text.setText("item refresh"); 
    for(int i=0;i<this.categoryList.size();i++){ 
     Log.d("categoryListitem",categoryList.get(i).getName()); 
    } 
    } 

를 표시하는 것입니다

public class CategoryGridAdapter extends ArrayAdapter<Category> { 

private List<Category> categoryList; 
private Context context; 

public CategoryGridAdapter(Context context, int resource, List<Category> categoryList) { 
    super(context, resource, categoryList); 
    this.context = context; 
    this.categoryList = categoryList; 
} 

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 

@Override 
public int getCount() { 
    return ((null != categoryList) ? 
      categoryList.size() : 0); 
} 

@Override 
public Category getItem(int position) { 
    return ((null != categoryList) ? 
      categoryList.get(position) : null); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (null == view) { 
     view = layoutInflater.inflate(R.layout.grid_category, null); 
    } 

    final Category category = categoryList.get(position); 
    Log.d("categorygridlist",category.getName()+" "+position+ " " + categoryList.size()); 

    if (category != null) { 
     final CardView categoryGridLayout = (CardView) view.findViewById(R.id.category_gridlayout); 
     final TextView categoryName = (TextView) view.findViewById(R.id.category_name); 
     final ImageView categoryIcon = (ImageView) view.findViewById(R.id.category_icon); 

     categoryName.setText(category.getName()); 
     categoryName.setSelected(true); 
     try { 
      byte[] decodedString = Base64.decode(category.getImage(), Base64.DEFAULT); 
      BitmapFactory.Options options=new BitmapFactory.Options();// Create object of bitmapfactory's option method for further option use 
      options.inPurgeable = true; // inPurgeable is used to free up memory while required 
      Bitmap decodedByte1 = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);//Decode image, "thumbnail" is the object of image file 
      Bitmap decodedByte = Bitmap.createScaledBitmap(decodedByte1, 50 , 50 , true);// convert decoded bitmap into well scalled Bitmap format. 

      categoryIcon.setImageBitmap(decodedByte); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     categoryGridLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "worked", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    return view; 
} 

사용자가 작업 탭을 선택했지만 작업 범주 만 표시 할 때보기 페이저에서 항목 탭과 작업 범주를 선택하면보기 페이저에 항목 범주가 표시됩니다. 누구든지 이것에 대한 해결책을 얻었습니까? ViewPagerAdapter 클래스에서 감사

+0

@Mike M. Log.d를 사용하여 tempList가 올바르게 업데이트되었는지 확인합니다. – phoon

+0

예, 처음에 내 update() 메소드가 표시되지 않았으므로 주석을 삭제했습니다. –

+0

오, 이제 알겠습니다. 두 조각 모두'ViewPagerAdapter'에서 정의한 것과 같은'List categoryList'를 사용하고 있으며 생성자에서 전달됩니다. 그러지 마. 각각에 새로운 ArrayList 을 만들고 생성자에서 해당 매개 변수를 제거하십시오 (어쨌든 거기에 없어야 함). –

답변

3

, 당신은 자신의 생성자 모두 Fragment들에 전달하는 List<Category> categoryList이 있고, 각 Fragment는 데이터 세트로 같은 목록을 설정하는 것입니다. setCategory()update() 방법의 로그 인쇄는 업데이트가 순차적으로 진행되고 그 중간에 목록이 지워지므로 올바른 것으로 보입니다.

각 에 List을 전달하는 대신 각자 고유 한 ArrayList<Category>을 만들고 각 생성자에서 해당 매개 변수를 제거하십시오.

관련 문제