2016-03-21 26 views
0

Listede, bazı öğeleri LongClick'e seçmeye çalıştığım ListView'im var. Ekranımda 8 öğe görebiliyorum (başka bir akıllı telefon üzerinde 6 tane ürün görebiliyorum.) ListView'imde çok fazla öğeye sahip olduğumda (örneğin 23) ve ben bir öğenin ilk satırında LongClick'i değiştirdim, ancak değiştirilen resmi görüyorum. aşağı kaydırırsam 10 ve 19 öğelerin de resim değiştirdiğini görebilirim (kontrol edilmiş gibi). LongClick'ten sonra başka bir akıllı telefonda, ilk öğeyi değiştirdiğimde 8 ve 16'yı değiştiriyorum vb.). Gördüğünüz gibi, akıllı telefonumu sunabildiğim gibi aynı sayıda öğeden hemen sonra, ListView öğelerini değiştirebilirim. "Ek" öğelerin gerçek durumu değişmedi, yalnızca onların resim görünümü. ListView öğelerinin görüntü grubunu değiştiren yinelenen tuhaf davranışı (grup, ListView öğelerinin sayısını akıllı telefonun aynı anda görüntüleyebileceği öğelerin sayısı kadardır)Fragman List Görünümü tuhaf davranış

Kodumda ne var ne yok ListView bu beklenmedik davranış? Thanx

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ImageView; 
import android.widget.ListView; 

import ru.someCode.R; 

public class ListItems extends ListFragment { 

    private ListView lv; 

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

     View rootView = inflater.inflate(R.layout.fragment_list, null); 
     lv = getListView(); 

     return rootView; 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 

     super.onListItemClick(l, v, position, id); 
    } 


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

     getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> adapter, View view, 
              int position, long id) { 

       Log.d("MY", "Checked"); 

       ImageView imageView = ((ImageView) view.findViewById(R.id.operImg)); 
       ImageView imageViewCheck = ((ImageView) view.findViewById(R.id.operImgCheck)); 

       if (lv.isItemChecked(position)) { 

        lv.setItemChecked(position, false); 
        imageView.setVisibility(View.VISIBLE); 
        imageViewCheck.setVisibility(View.GONE); 


       } else { 

        lv.setItemChecked(position, true); 
        imageView.setVisibility(View.INVISIBLE); 
        imageViewCheck.setVisibility(View.VISIBLE); 

       } 
       return true; 
      } 
     }); 
    } 
} 

---- fragment_list.xml ----

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="6dp"> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/listContainer"> 

      <ListView 
       android:id="@android:id/list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:dividerHeight="1dip" 
       android:divider="@color/listDev" 
       android:footerDividersEnabled="true"/> 

      <TextView 
       android:id="@id/android:empty" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:textSize="16sp" 
       android:gravity="center" /> 

     </FrameLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/progressContainer" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:visibility="gone"> 

      <ProgressBar style="?android:attr/progressBarStyleLarge" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
     </LinearLayout> 

    </RelativeLayout> 
</LinearLayout> 

---- adaptör kod parçası ---

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     if (convertView == null) { 

      LayoutInflater inflater = (LayoutInflater) mContext 
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.history_list_group, null); 

      holder = findViewsById(convertView); 
      convertView.setTag(holder); 

      if (lv == null) { 
       lv = (ListView) parent; 
      } 


     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 

     SetDataView(holder, position); 

     return convertView; 
    } 

---- history_list_group. xml -

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

     <RelativeLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/circle" 
      android:id="@+id/operImgLayout" 
      android:layout_gravity="center_vertical" 
      android:layout_margin="6dp"> 

      <ru.phone4pay.phone4pay.extlib.MLRoundedImageView 
       android:id="@+id/operImg" 
       android:layout_width="50dp" 
       android:layout_height="50dp" 
       android:src="@drawable/ic_action_1"/> 

      <ImageView 
       android:layout_width="20dp" 
       android:layout_height="20dp" 
       android:id="@+id/operImgCheck" 
       android:src="@drawable/ic_action_tick" 
       android:layout_centerHorizontal="true" 
       android:layout_centerVertical="true" 
       android:visibility="gone"/> 

     </RelativeLayout> 

</LinearLayout> 
+0

GetView'iniz düzgün şekilde kodlanmamış gibi görünüyor. –

+0

Tam bağdaştırıcı kodunu göster ve setDataView kodu –

+0

Bu soruyu reddetmeniz gerekmiyor. @ user5546244 Konumunuzu koruyarak, benzer bir soruyu kontrol edebilirsiniz ve aynı zamanda http://stackoverflow.com/questions/11190390/checking-a-checkbox-in-listview-makes-other-random-checkboxes-checked -eğitim .. verilen bağlantıyı kontrol edin ve cevap deneyin ve kodunuzla eşleştirin, aynı sorunu yaşadığınızı tespit ettiyseniz, bunu kullanarak çözmek ve kendi sorununun başarıyla çözüldükten sonra kendi sorunuzu silin – MKJParekh

cevap

0

ListView geri dönüştürür vie Ws, bu yüzden yanlış koddum. Benim kararlarım ListFragment de

--- --- adaptörü de

private ListView lv;  
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

       @Override 
       public boolean onItemLongClick(AdapterView<?> adapter, View view, 
               int position, long id) { 

        lv.setItemChecked(position, !lv.isItemChecked(position)); 
        mAdapter.setCheckedItems(position, lv.isItemChecked(position)); 

        return true; 
       } 
      }); 

--- -

private boolean [] checkedItems; 

     public void setCheckedItems(int position, boolean state){ 
      checkedItems[position] = state; 
      notifyDataSetChanged(); 
     } 

     public void unCheckAllItems(){ 
      for (int i=0; i<checkedItems.length; i++){ 
       checkedItems[i] = false; 
      } 
     } 

private void SetDataView(ViewHolder holder, int position){ 

     if (checkedItems[position]){ 
      holder.operImgCheck.setVisibility(View.VISIBLE); 
      holder.operImg.setVisibility(View.INVISIBLE); 
     } else { 
      holder.operImgCheck.setVisibility(View.INVISIBLE); 
      holder.operImg.setVisibility(View.VISIBLE); 
     } 
} 
sorunun

Ana nedeni: Ben değiştirebilir ve adaptör yeniden ama yapmalıyım ListView'den öğeleri değiştir! ListView öğelerini, bunları değiştirmek için ListView'e erişmeyin.