2017-10-23 20 views
0

개발 및 Android 앱을 개발하려고하고 있으며 사용자가 세그먼트 화 된 옵션에서 다른 옵션을 선택하면 내용을 변경하는 ListView 용 사용자 지정 어댑터를 작성했습니다 그룹.사용자 지정 ListView는 첫 번째 작업에만 업데이트되고 두 번째 작업에는 내용이 표시되지 않습니다.

세그먼트 컨트롤이 변경되어 내용이 올바르게 표시되지만 두 번째 선택에서는 모든 데이터를 사용할 수 있지만 내용이 표시되지 않습니다.

크게 될 것이다 올바르게 어댑터를 업데이트하는 방법에 대한 조언은 어댑터와 ListView에 데이터를 수정할

코드 감사

SegmentedButtonGroup segmentedButtonGroup = (SegmentedButtonGroup) 
findViewById(R.id.segmented_button_group); 
segmentedButtonGroup.setOnClickedButtonPosition(new 
SegmentedButtonGroup.OnClickedButtonPosition() { 
     @Override 
     public void onClickedButtonPosition(int position) { 
      Toast.makeText(listing_see.this, "Clicked: " + position, 
      Toast.LENGTH_SHORT).show(); 

      // Need to make this update the list view on click 
      if(position == 0){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles1, 
       allThumbnails1, blurbs1); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } else if (position == 1){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles2, 
       allThumbnails2, blurbs2); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } else if (position == 2){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles3, 
       allThumbnails3, blurbs3); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } 
     } 
    }); 

listingview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="110dp" 
     android:layout_height="80dp" 
     android:padding="5dp" /> 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/item" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Medium Text" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:layout_marginLeft="10dp" 
      android:layout_marginTop="5dp" 
      android:padding="2dp" 
      android:textColor="#33CC33" /> 
     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" 
      android:layout_marginLeft="10dp"/> 
    </LinearLayout> 
</LinearLayout> 

CustomListAdapter

public class CustomListAdapter extends ArrayAdapter<String> { 

    private final Activity context; 
    private final List<String> itemname; 
    private final List<String> imgid; 
    private final List<String> blurbs; 

    public CustomListAdapter(Activity context, List<String> itemname, List<String> imgid, List<String> blurbs) { 
     super(context, R.layout.listingview, itemname); 

     this.context=context; 
     this.itemname=itemname; 
     this.imgid=imgid; 
     this.blurbs=blurbs; 
    } 

    public View getView(int position,View view,ViewGroup parent) { 
     LayoutInflater inflater=context.getLayoutInflater(); 
     View rowView=inflater.inflate(R.layout.listingview, null,true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.item); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); 
     TextView extratxt = (TextView) rowView.findViewById(R.id.textView1); 

     int imageID = getContext().getResources().getIdentifier(imgid.get(position), "drawable", context.getPackageName()); 

     txtTitle.setText(itemname.get(position)); 
     imageView.setImageResource(imageID); 
     extratxt.setText(blurbs.get(position)); 
     return rowView; 
    }; 
} 
예상대로 올바르게 다른 탭의 디스플레이에 처음 클릭 Screenshots of what is happening

초기로드를 표시하고 다른 탭을 선택하면 데이터가 보지되도록 : 시뮬레이터의 617,451,515,

일부 스크린 샷은 무슨 일이 일어나고 있는지 표시합니다.

답변

0

변경

adapter.clear(); 
adapter = new CustomListAdapter(listing_see.this, titles1, 
allThumbnails1, blurbs1); 
adapter.notifyDataSetChanged(); 
list.setAdapter(adapter); 

전부
adapter.clear(); 
adapter.add(titles2, allThumbnails2, blurbs2); 
adapter.notifyDataSetChanged(); 

합니다. 매번 어댑터의 새로운 객체를 만들고 있으므로 adapter.clear()은 아무 것도하지 않습니다. 또한 어댑터의 새 객체를 만든 후에는 해당 객체가 목록에 추가되지 않지만 notifyDataSetChanged을 호출합니다.

해야 할 일 1. 어댑터 데이터를 지우십시오.

  1. 어댑터에 새 데이터를 추가하십시오.

  2. NotifyDataSetChanged. (new CustomListAdapter 키워드를 사용해서는 안됩니다).

희망이 있습니다.

+0

안녕하세요, 귀하의 회신에 감사드립니다. 내 목록에 제목, 추천 및 섬네일 (문자열)이있어 항목에 3 개의 값을 전달할 때 간단한 추가 작업이 내 상황에서 작동하지 않습니다. 이 작업을 수행 할 수 있도록 내 CustomListAdapter에서 오버로드해야한다고 생각하지만, 그 방법을 완전히 확신하지는 못합니다. – Ashley

+0

문제를 더 생각한 후에 아마도 객체에 전달할 객체를 전달하고 객체를 전달하는 3 개의 항목을 돌리면 사용자가 제안한 것과 작동 할 수있는 CustomListAdapter 생성자를 변경합니다. – Ashley

+0

빌더 기반의 setter로 항목을 추가하거나 3 개의 인수로 메소드를 만들 수 있습니다. –