2013-02-28 3 views
0

기본 목록을 확장하는 내 List View 용 사용자 정의 어댑터를 작성했습니다. 내 list_item.xml에 다른 행을 추가 할 때까지 제대로 작동했습니다. 이제 내 OnItemClickListner에서 클릭 할 때 숨겨진 행의 항목에 대한 설명이 표시되어야합니다. 어떤 항목을 클릭하면 항목의 행이 표시되고 다른 항목은 목록의 맨 아래에 표시됩니다. 단 하나의 항목 만 눌렀지만 항목의 행을 다시 스크롤하면 클릭하면 사라지지만 다른 하나는 열렸습니다. 나는 수색하고 그것이 내가 bindview를 사용하지 않기 때문에 그것이 있을지도 모른다는 것을 발견했다. 그리고 모든 List는 그것들을 재사용한다. 그 경우에는 어떻게 내 customAdapter에 bindVIew를 구현할 수 있습니다. 내 customAdapterAndroid : ListView & customAdapter - 클릭하면 2 개 항목의 정보를 보여줍니다./editText를 클릭 할 수 없습니다.

public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
      // getting values from selected ListItem 
       if ((((LinearLayout) view.findViewById(R.id.edit)).getVisibility()) == (View.VISIBLE)) 
       { 
        ((LinearLayout) view.findViewById(R.id.edit)).setVisibility(View.GONE); 
       }else 
       { 
        ((LinearLayout) view.findViewById(R.id.edit)).setVisibility(View.VISIBLE); 
        ((EditText) view.findViewById(R.id.itemn)).setFocusable(true);    
        new LoadCategories().execute(); 

       } 

2 문제의 ataached의 내 클릭에 청취자와의 getView : 내 설명 행이 내가 어떤 항목을 누르면 항목에서 볼 수있는 설명을 보여줍니다 글고을 가지고 있습니다. 하지만 그것을 변경하거나 그것을 편집 할 때 그것을 누르면 언론에 나타납니다.

public View getView(final int position, View convertView, ViewGroup parent) { 
     System.out.println("getView " + position + " " + convertView); 
     final ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(l, null); 
      holder = new ViewHolder(); 

      holder.id = (TextView)convertView.findViewById(R.id.id); 
      holder.name = (TextView)convertView.findViewById(R.id.name); 
      holder.price = (TextView)convertView.findViewById(R.id.price); 
      holder.description = (TextView)convertView.findViewById(R.id.description); 
      holder.button = (Button) convertView.findViewById(R.id.update); 
      holder.btn = (Button) convertView.findViewById(R.id.order); 

      holder.en = (EditText)convertView.findViewById(R.id.itemn); 
      holder.ep = (EditText)convertView.findViewById(R.id.pri); 
      holder.ed = (EditText)convertView.findViewById(R.id.descript); 

      convertView.setTag(holder); 
     } 

     else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 
     holder.id.setText(getId(getItem(position))); 
     holder.name.setText(getName(getItem(position))); 
     holder.price.setText("£ " + getPrice(getItem(position))); 
     holder.description.setText(getDesc(getItem(position))); 
     holder.btn.setVisibility(View.GONE); 


     holder.en.setText((holder.name.getText()).toString()); 
     holder.ep.setText((holder.price.getText()).toString()); 
     holder.ed.setText((holder.description.getText()).toString()); 

     return convertView; 
    } 
    public void clear(){ 
     itemsList.clear(); 
     notifyDataSetChanged(); 
    } 

} 

여기 내 list_item.xml입니다. 기본적으로 첫 번째 tableRow는 hashMap의 배열에서 전달 된 모든 정보를 보여줍니다. 두 번째 행은 아직 사용되지 않았습니다. 세 번째 TableRow는 첫 번째 행에서 정보를 가져 와서 editText로 설정합니다. 그런 다음 수정할 수 있으므로 나중에 수정 된 정보로 데이터베이스를 업데이트하는 데 사용됩니다. 세 번째 행은 숨겨져 있으며 항목을 누르면 표시됩니다.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:paddingBottom="5dp" > 

<TableRow 
    android:id="@+id/tableRow1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:baselineAligned="false" > 

    <TextView 
     android:id="@+id/id" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#FFFFFF" 
     android:visibility="gone" /> 

    <TextView 
     android:id="@+id/quantity" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="0.5" 
     android:gravity="left" 
     android:textAllCaps="true" 
     android:textColor="#FFFFFF" 
     android:textSize="30sp" 
     android:textStyle="bold" 
     android:typeface="serif" 
     android:visibility="gone" /> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="left" 
     android:layout_weight="3" 
     android:gravity="left" 
     android:textAllCaps="true" 
     android:textColor="#FFFFFF" 
     android:textSize="30sp" 
     android:textStyle="bold" 
     android:typeface="serif" /> 

    <TextView 
     android:id="@+id/price" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_weight="1" 
     android:gravity="right" 
     android:paddingRight="15dp" 
     android:textAllCaps="true" 
     android:textColor="#FFFFFF" 
     android:textSize="30sp" 
     android:textStyle="bold" 
     android:typeface="serif" /> 

    <Button 
     android:id="@+id/order" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_weight="0" 
     android:focusable="false" 
     android:minHeight="0dp" 
     android:minWidth="50dp" 
     android:text="+" 
     android:textStyle="bold" /> 

</TableRow> 

<TableRow 
    android:id="@+id/tableRow2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/tableRow1" 
    android:gravity="center_horizontal" > 

    <TextView 
     android:id="@+id/description" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textAllCaps="true" 
     android:textColor="#FFFFFF" 
     android:textSize="20sp" 
     android:textStyle="bold" 
     android:typeface="serif" 
     android:visibility="gone" /> 

</TableRow> 

<TableRow 
    android:id="@+id/TableRow01" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="false" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@id/tableRow2" 
    android:gravity="center_horizontal" > 

    <LinearLayout 
     android:id="@+id/edit" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     <EditText 
      android:id="@+id/itemn" 
      android:layout_width="match_parent" 
      android:layout_height="69dp" 
      android:ems="10" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:gravity="top|left" 
      android:hint="NAME" 
      android:inputType="text" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 

     <EditText 
      android:id="@+id/descript" 
      android:layout_width="match_parent" 
      android:layout_height="82dp" 
      android:ems="10" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:gravity="top|left" 
      android:hint="DESCRIPTION" 
      android:inputType="textMultiLine" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 

     <EditText 
      android:id="@+id/pri" 
      android:layout_width="match_parent" 
      android:layout_height="62dp" 
      android:ems="10" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:gravity="top|left" 
      android:hint="£ PRICE" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 

     <Spinner 
      android:id="@+id/spinne" 
      style="@style/spinner_style" 
      android:layout_width="352dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:background="@drawable/dropdown" 
      android:gravity="center" 
      android:overScrollMode="always" 
      android:prompt="@string/orders" 
      android:textAlignment="center" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 

     <Button 
      android:id="@+id/update" 
      android:layout_width="135dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_weight="0.55" 
      android:focusable="false" 
      android:text="update" 
      android:textAllCaps="true" /> 

    </LinearLayout> 
</TableRow> 

</RelativeLayout> 

답변

1

내가 아래로 스크롤하여 항목 A 사라를 클릭하지만 그 자체로 열린 다른 하나는 개방 상태로 유지의 최대 다시 행 때 나는 하나 개의 항목 에 눌려 있지만.

ListView의 재활용보기와 싸우고 있습니다. Google의 Turbo-Charge your UI에서이 작동 방식에 대한 자세한 설명을 볼 수 있습니다. 해결책은 간단합니다. 어댑터 내에서 펼쳐진 행을 기억하고 그에 따라 행을 설정해야합니다. getView()또는은 기본적으로 모든 행을 축소합니다.

하지만 그걸 눌러서 변경하거나 표시하면 편집 할 수 없습니다.

EditText를 포커스 할 수있게 만드는 것으로 나타났습니다. 대신 setFocusableInTouchMode()을 변경해보십시오. 이러한 방법은 미묘한 방법으로 연결되어 있습니다. 내가 가진


추가
한 관찰하면 레이아웃이 하나의 아이가있는 경우 그때는 아마 그것을 제거 할 수 있습니다, 불필요한 레이아웃을 가지고있다. 예를 들어, TableLayout 또는 RelativeLayout 을 제거 할 수 있습니다. LinearLayout edit 또는 TableRow를 제거 할 수 있습니다.

확장 부품을 닫거나 숨기려면 항목을 억 제할 수 없습니다.

3 번째 행을 다시 숨기려면 1 또는 2 행에서 아무 것도 터치 할 수없는 구체적인 이유는 없습니다.아마 당신은/숨 깁니다이 행을 표시하는 버튼을 추가 /해야

내가 직면하는 것은 내가 항목을 누르면 열리는 확장 된 부분은 내가 다른 사용자를 걸어

아래로 스크롤 할 때 사라입니다 Android: ListView bug
제 대답은 각 행이 추가 레이아웃을 표시하거나 숨길 지 여부를 추적하기 위해 expanded을 사용하는 방법에주의를 기울여야하고 expandedmName에서 제어되는 방식을 추적합니다.

+0

답장을 보내 주셔서 감사합니다. 두 번째 부분에 관해서. 그것은 잘 작동하지만 아무도 내가 그것을 다 끝내면 항목을 닫거나 숨길 확장 부분을 억압 할 수 없다. 첫 번째 부분에 대해서는 제가 비디오를 보았을 때의 모든 예제입니다.하지만 제가 직면 한 문제는 실제로 문제가 아닙니다. 제가 확장 된 부분은 전체 항목이 아니라 아래로 스크롤 할 때 항목을 누르면 사라집니다. . –

+0

질문 아래의 [ "edit"] (http://stackoverflow.com/posts/15147124/edit)를 클릭하고 각 행에 사용하는 XML을 게시하십시오. 그래서 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다. (당신이 이것을했을 때 알려주세요.) – Sam

+0

예. 나는 그것을 더하고 그것보다 조금 더 설명해야합니다. 감사합니다 –