2014-04-05 1 views
3

기본적으로 왼쪽에있는 표시기 아이콘을 설정하고 싶습니다. 오른쪽에 표시되어야합니다. 나는 Google에서 찾은 모든 기술을 시도했지만 몇 가지 내 expandablelistview 잘못된 것 같습니다 또는 그것을 할 수있는 다른 방법이 있습니다 나는 시도 : explistobj.setInicatorBounds (...) 작동하지 않습니다 : (XML 안드로이드에서 추가 속성 : indicatorLeft = "250dp" 안드로이드 : indicatorRight는 = "300dp"가되지 작동 :(확장 가능 목록보기 표시기가 오른쪽에 설정되어 있지 않습니다.

코드 :.

public class MainActivity extends Activity { 

     ExpandableListAdapter listAdapter; 
     ExpandableListView expListView; 
     List<String> listDataHeader; 
     HashMap<String, List<String>> listDataChild; 

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

      // get the listview 
      expListView = (ExpandableListView) findViewById(R.id.lvExp); 

      // preparing list data 
      prepareListData(); 
      setDimens(); 

      listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

      // setting list adapter 
      expListView.setAdapter(listAdapter); 

      // Listview Group click listener 
      expListView.setOnGroupClickListener(new OnGroupClickListener() { 

       @Override 
       public boolean onGroupClick(ExpandableListView parent, View v, 
         int groupPosition, long id) { 
        // Toast.makeText(getApplicationContext(), 
        // "Group Clicked " + listDataHeader.get(groupPosition), 
        // Toast.LENGTH_SHORT).show(); 
        return false; 
       } 
      }); 

      // Listview Group expanded listener 
      expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

       @Override 
       public void onGroupExpand(int groupPosition) { 
        Toast.makeText(getApplicationContext(), 
          listDataHeader.get(groupPosition) + " Expanded", 
          Toast.LENGTH_SHORT).show(); 
       } 
      }); 

      // Listview Group collasped listener 
      expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 

       @Override 
       public void onGroupCollapse(int groupPosition) { 
        Toast.makeText(getApplicationContext(), 
          listDataHeader.get(groupPosition) + " Collapsed", 
          Toast.LENGTH_SHORT).show(); 

       } 
      }); 

      // Listview on child click listener 
      expListView.setOnChildClickListener(new OnChildClickListener() { 

       @Override 
       public boolean onChildClick(ExpandableListView parent, View v, 
         int groupPosition, int childPosition, long id) { 
        // TODO Auto-generated method stub 
        Toast.makeText(
          getApplicationContext(), 
          listDataHeader.get(groupPosition) 
            + " : " 
            + listDataChild.get(
              listDataHeader.get(groupPosition)).get(
              childPosition), Toast.LENGTH_SHORT) 
          .show(); 
        return false; 
       } 
      }); 
     } 

     /* 
     * Preparing the list data 
     */ 
     private void prepareListData() { 
      listDataHeader = new ArrayList<String>(); 
      listDataChild = new HashMap<String, List<String>>(); 

      // Adding child data 
      listDataHeader.add("mylist0"); 
      listDataHeader.add("mylist1"); 
      listDataHeader.add("mylist2"); 

      // Adding child data 
      List<String> top250 = new ArrayList<String>(); 
      mylist0.add("item1"); 
      mylist0.add("item2"); 
      mylist0.add("item3"); 

      List<String> mylist1 = new ArrayList<String>(); 
       mylist1.add("Item1"); 
      mylist1.add("Item2"); 
      mylist1.add("Item3"); 
      mylist1.add("Item4"); 
      mylist1.add("Item5"); 
      mylist1.add("Item6"); 

      List<String> mylist2 = new ArrayList<String>(); 
      mylist2.add("item1"); 


      listDataChild.put(listDataHeader.get(0), mylist0); // Header, Child data 
      listDataChild.put(listDataHeader.get(1), mylist1); 
      listDataChild.put(listDataHeader.get(2), mylist2); 
     } 
     public int GetDipsFromPixel(float pixels) 
     { 
       // Get the screen's density scale 
       final float scale = getResources().getDisplayMetrics().density; 
       // Convert the dps to pixels, based on density scale 
       return (int) (pixels * scale + 0.5f); 
     } 

     public void setDimens() 
     { 
      Display display = getWindowManager().getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      int width = size.x; 
      int height = size.y; 
      Display display2 = getWindowManager().getDefaultDisplay(); 
      int width2 = display2.getWidth(); // deprecated 
      int height2 = display2.getHeight(); // deprecated 
      //expListView.setIndicatorBounds(width2-GetDipsFromPixel(35), width2-GetDipsFromPixel(5)); //not works 
      expListView.setIndicatorBounds(expListView.getRight()- 40, expListView.getWidth()); //not works 

     } 
    } 

xml code: 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#f4f4f4" > 

      <ExpandableListView 
       android:id="@+id/lvExp" 
       android:layout_height="match_parent" 
       android:layout_width="match_parent" 
       android:cacheColorHint="#00000000" 
       <!-- 
       android:indicatorLeft="250dp" 
       android:indicatorRight="300dp"       
       --> 
      /> 

</LinearLayout> 

답변

16

내 시나리오에서 일했다, 이것을 시도하십시오 확장 가능한 목록보기의 XML 코딩입니다 layout.xml

<ExpandableListView 
    android:id="@+id/expandableListView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_marginTop="50dp" 
    android:groupIndicator="@drawable/group_indicator" 
    android:cacheColorHint="#00000000" 
    android:childDivider="@android:color/transparent" 
    android:divider="#d4d4d4" 
    android:dividerHeight="1dp" 
    android:scrollbars="vertical|horizontal" > 
</ExpandableListView> 

group_indicator.xml

<?xml version="1.0" encoding="utf-8"?> 

<item android:drawable="@drawable/arrow_right" android:state_empty="true"></item> 
<item android:drawable="@drawable/arrow_down" android:state_expanded="true"></item> 
<item android:drawable="@drawable/arrow_right"></item> 

다음 자바 파일에서 코드입니다.

DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    int width = metrics.widthPixels; 
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     expandableListView.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
     searchExpListView.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
    } else { 
     expandableListView.setIndicatorBoundsRelative(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
     searchExpListView.setIndicatorBoundsRelative(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
    } 

public int GetPixelFromDips(float pixels) { 
    // Get the screen's density scale 
    final float scale = getResources().getDisplayMetrics().density; 
    // Convert the dps to pixels, based on density scale 
    return (int) (pixels * scale + 0.5f); 
} 

가 확장 목록보기에 바로 표시에 대한 전체 코드의를 expandableExample.jav.

이제는 동일한 라이브러리를 사용할 수 있습니다. recyclerview를 사용하고 싶다면 커스텀 뷰를 사용하고 싶다면 확장 가능한 예제를 설명하는 groupie 라이브러리를 사용하십시오. groupie. 이 라이브러리는 안드로이드 데이터 바인딩이 필요합니다. recyclerview에서 다중 뷰를 처리하고 확장 가능한 기능도 있습니다.

+1

당신이 가로 및 세로 모드 모두에서 작업하는 경우이 코드를 onConfigurechnage()에도 넣으십시오. 다른 방향으로 변경하면 문제가 발생합니다. –

관련 문제