2014-12-18 3 views
1

나는 ListView을 사용하여 TextViews을 표시합니다. 내 응용 프로그램은 다음과 같습니다 : 나는 단어를 클릭하면Visibility GONE in ListView

enter image description here

은 사라 :

enter image description here

그러나 ListView 여전히 빈 행을 유지합니다. 나는 내 응용 프로그램을 클릭 한 후 다음과 같이 할 : 빈 행이 자리에 유지하는 이유

enter image description here

는 아는 사람 있나요. 왜 완전히 제거되지 않습니까? TextViews을 사라지게하려면 setVisibility(View.GONE)을 사용합니다.

LinearLayouts으로 간단히 설정하고 가시성을 GONE으로 설정하면 전체 행이 사라지고 그에 따라 자동으로 아래 행이 자동으로 조정됩니다.

편집 : 코드를 편집하여 adapter.remove(adapter.getItem(position))을 포함하게되었습니다. 이로 인해 내 애플리케이션이 중단됩니다. 오류 로그와 편집 된 코드를 추가했습니다. 도와주세요.

편집 코드 :

package com.example.listview; 

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     populateListView(); 
     registerClickCallback(); 
    } 

    private void populateListView() { 

     //Create list of items 
     String[] myItems = {"Blue", "Green","Purple","Red"}; 

     //Build Adapter 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.items, myItems); 

     //Configure the list view 
     ListView list = (ListView) findViewById(R.id.listView1); 
     list.setAdapter(adapter); 
    } 

    private void registerClickCallback() { 
     ListView list = (ListView) findViewById(R.id.listView1); 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       TextView textview = (TextView) view; 
       textview.setVisibility(View.GONE); 
       adapter.remove(adapter.getItem(position)); 
      } 
    }); 
} 

} 

오류 로그 : 게이브 언급 당신이 보여줄 필요가/경우, 다음을 숨기기 :

12-19 12:04:57.994: E/AndroidRuntime(23120): FATAL EXCEPTION: main 
12-19 12:04:57.994: E/AndroidRuntime(23120): Process: com.example.listview, PID: 23120 
12-19 12:04:57.994: E/AndroidRuntime(23120): java.lang.UnsupportedOperationException 
12-19 12:04:57.994: E/AndroidRuntime(23120): at java.util.AbstractList.remove(AbstractList.java:638) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at java.util.AbstractCollection.remove(AbstractCollection.java:229) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.widget.ArrayAdapter.remove(ArrayAdapter.java:244) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at com.example.listview.MainActivity$1.onItemClick(MainActivity.java:50) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.widget.AbsListView$3.run(AbsListView.java:3645) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.os.Handler.handleCallback(Handler.java:733) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.os.Handler.dispatchMessage(Handler.java:95) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.os.Looper.loop(Looper.java:136) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at android.app.ActivityThread.main(ActivityThread.java:5146) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at java.lang.reflect.Method.invokeNative(Native Method) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at java.lang.reflect.Method.invoke(Method.java:515) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
12-19 12:04:57.994: E/AndroidRuntime(23120): at dalvik.system.NativeStart.main(Native Method) 

답변

1

당신은

adapter.remove(adapter.getItem(position)); 

갱신 할 수 다른 이벤트를 기반으로 항목을 만들려면 사용자 지정 어댑터를 만들고 s tate를 사용하면 재활용 시간에 행의 가시성을 올바르게 설정할 수 있습니다. 또한 FunDapter, 쉬운 어댑터 및 기타 도움이 될 수있는 많은 라이브러리가 있습니다.

갱신 2 : 백업 목록이 .remove() 작업을 지원하는 경우 remove()에만 작동합니다 ... 그래서 당신은 당신은 부모 뷰 텍스트 뷰의 가시성을 변경하고 있지 new ArrayAdapter<String>(this, R.layout.items, new ArrayList(Arrays.asList(myItems)));

+0

adapter.remove (adapter.getItem (position)) 내 응용 프로그램이 충돌합니다. – user2456977

+0

어떤 오류가 있습니까? – danb

+0

오류 로그와 adapter.remove 메소드로 원래 게시물을 편집했습니다. 보세요. 도와 주시면 알려주세요. 지금까지 도와 줘서 고마워. – user2456977

0

할 수 - 행 항목을 선택합니다. 이상적인 방법은 list에서 선택한 항목을 제거한 다음 어댑터의 notifyDatasetChanged()를 호출하는 것입니다.

1

많은 사람들이 데이터 집합에서 문자열을 제거 할 것을 제안합니다. 아이템을 다른 이벤트에 의해 변경된 가시성을 가질 수있는 버전을 원한다면 특히 그러지 않을 것입니다. 이렇게하는 일반적인 방법은 각 인덱스의 문자열 값과 항목의 가시성을 모두 추적하는 사용자 지정 어댑터를 만드는 것입니다. 그런 다음 getView에서 주어진 색인에 대한 텍스트보기의 가시성을 올바르게 설정해야합니다.

listviews에서보기 재활용을 사용하기 때문에 텍스트보기의 가시성을 설정하는 것은 좋지 않습니다. 이로 인해 런타임시 각 텍스트 뷰에 표시되는 인덱스가 변경되므로 getView에서 제대로 설정하지 않고 텍스트 뷰의 가시성을 직접 변경하면 매핑이 변경 될 때 문제가 발생합니다.

+0

합의 할 수 있습니다. 행을 개별적으로 제거하고 추가하면 어댑터를 구현할 수 있습니다. 이것이 요구 사항이 아니라면 맞춤 어댑터를 구현하는 것이 잔인하며 사용할 수있는 API 만 사용하는 것이 좋습니다. adapter.clear()를 사용하여 어댑터의 전체 내용을 재설정 할 수 있습니다. adapter.addAll (myItems) – danb