2016-07-12 5 views
0

Java-CodeAndroid Listview-Adapter getView() -Methode ruft mehr als ein mal

public class ContentListAdapter extends ArrayAdapter<Content> implements Filterable { 

//private static final String TAG = ContentListAdapter.class.getCanonicalName(); 
private static final LogTracer LOG_TRACER = LogTracer.instance(ContentListAdapter.class); 
private Context mContext; 
private LayoutInflater mInflater; 
private List<Content> mContents; 
private List<Content> mContentsFiltered; 
private int lastPosition = -1; 
private boolean multiselectMode = false; 
private Customer mCustomer = null; 

private AdapterView.OnItemClickListener mOnItemClickListener; 
private AdapterView.OnItemLongClickListener mOnItemLongClickListener; 
PatientRatingDAO patientRatingDAO; 
int completeVisiblePosition=0; 
public int totalScrollCount= 0; 
private boolean isFromHomeSearch; 
private ListView mListView; 
public View helpView; 

public ContentListAdapter(Context context, List<Content> contents, ListView listView) { 
    super(context, R.layout.list_content, contents); 
    mContext = context; 
    mContents = contents; 
    mListView = listView; 
    mContentsFiltered = contents; 
    mInflater = LayoutInflater.from(mContext); 
    mCustomer = new CustomerDAO(context).getCurrentCustomer(); 
    patientRatingDAO = new PatientRatingDAO(getContext()); 

} 


private class ViewHolder { 
    View listContent; 
    ImageButton contentThumbnail, contentThumbnailNew,typeofarticle; 
    LinearLayout contentRightSec; 
    LinearLayout contentRightSecBottom; 
    TextView fileSize; 
    LinearLayout tagsView; 
    TextView contentPostTime; 
    TextView contentDescription; 
    TextView contentSource; 

    LinearLayout rateCountSec; 
    LinearLayout rateBarLayout; 
    TextView rateCount; 
    TextView likeCount; 
    TextView likeText; 
    ImageView likeImage,likeCountImage,rateCountImage,readtick; 
    RatingBar ratingBar; 
    RatingBar disabledRatingBar; 
    RelativeLayout patienteducation; 
    //int isLiked; 
    //int currentUserRateCount; 

} 



@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) { 
    // assign the view we are converting to a local variable 
    View v = convertView; 
    LOG_TRACER.d("parm getView " + position + " " + convertView); 
    // Calculating Scroll Count 
    if(getCompleteVisiblePosition() == 0){ 
     if(v != null && mListView != null){ 
      this.setCompleteVisiblePosition(calculateCompletelyVisibleListItems(v)); 
      LOG_TRACER.d("parm completeVisiblePosition" + completeVisiblePosition); 
     } 
    } 
    if(getCompleteVisiblePosition() > 0){ 
     if(position % getCompleteVisiblePosition() == 0){ 
      totalScrollCount++; 
      LOG_TRACER.d("parm totalScrollCount" + totalScrollCount); 
     } 
    } 
    // first check to see if the view is null. if so, we have to inflate it. 
    // to inflate it basically means to render, or show, the view. 
    if (v == null) { 
     //LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     //v = inflater.inflate(mLayout, null); 
     v = LayoutInflater.from(mContext).inflate(R.layout.list_content, parent, false); 
     ViewHolder holder = new ViewHolder(); 

     holder.rateCount = (TextView) v.findViewById(R.id.rateCount); 
     holder.likeCount = (TextView) v.findViewById(R.id.likeCount); 
     holder.likeCountImage = (ImageView) v.findViewById(R.id.likeCountImage); 
     holder.rateCountImage = (ImageView) v.findViewById(R.id.rateCountImage); 
     holder.likeText = (TextView) v.findViewById(R.id.like_text); 
     holder.likeImage = (ImageView) v.findViewById(R.id.like_image); 
     holder.ratingBar = (RatingBar) v.findViewById(R.id.ratingBar); 
     holder.disabledRatingBar = (RatingBar) v.findViewById(R.id.disabled_rating_bar); 
     holder.typeofarticle = (ImageButton) v.findViewById(R.id.typeofarticle); 
     holder.patienteducation = (RelativeLayout) v.findViewById(R.id.patient_education); 
     v.setTag(holder); 
    } 


    final Content content = getItem(position); 
    final ViewHolder viewHolder = (ViewHolder) v.getTag(); 
    if(viewHolder.listContent != null) { 
     if(content.getIs_Read() == Constants.INT_FLAG_YES) { 
      viewHolder.listContent.setBackgroundResource(R.drawable.list_selector_content_grey); 
      viewHolder.readtick.setVisibility(View.VISIBLE); 
     } else { 
      viewHolder.listContent.setBackgroundResource(R.drawable.list_selector_content_white); 
      viewHolder.readtick.setVisibility(View.GONE); 
     } 


    if(viewHolder.contentThumbnailNew != null){ 
     Ion.with(viewHolder.contentThumbnailNew).fitXY().placeholder(R.drawable.imagethumbnail).fitXY().error(R.drawable.imagethumbnail).fitXY().load(
       (!TextUtils.isEmpty(content.getDA_Thumbnail_Url()))?content.getDA_Thumbnail_Url().replaceAll(" ","%20") : content.getDA_Thumbnail_Url()); 
    } 

    if(viewHolder.contentThumbnail != null) { 
     viewHolder.contentThumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (SettingsUtils.getDefaultCompanyId(mContext) == content.getCompany_Id() && !isFromHomeSearch) { 
        if (multiselectMode) { 
         if (mOnItemClickListener != null) 
          mOnItemClickListener.onItemClick(null, v, position, position); 
        } else { 
         if (mOnItemLongClickListener != null) 
          mOnItemLongClickListener.onItemLongClick(null, v, position, position); 
        } 
       } else { 
        if (mOnItemClickListener != null) 
         mOnItemClickListener.onItemClick(null, v, position, position); 
       } 

      } 
     }); 




     viewHolder.contentThumbnailNew.setOnTouchListener(new TouchExtendedClickListener(mContext, new TouchExtendedClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view) { 
       if (mOnItemClickListener != null) mOnItemClickListener.onItemClick(null, convertView, position, position); 
      } 
     })); 
     viewHolder.contentThumbnailNew.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       if (SettingsUtils.getDefaultCompanyId(mContext) == content.getCompany_Id() && !isFromHomeSearch) { 
        if (multiselectMode) { 
         if (mOnItemClickListener != null) 
          mOnItemClickListener.onItemClick(null, v, position, position); 
        } else { 
         if (mOnItemLongClickListener != null) 
          mOnItemLongClickListener.onItemLongClick(null, v, position, position); 
        } 
       } 
       return true; 
      } 
     }); 

     } 
    } 


    } 


    //To Set Ratings 
    if (viewHolder.rateCount != null) { 
     //Calculate rate count by (totalratigs/numberofusersrated) 
     if(content.getTotalRatings() == 0 || content.getTotalRatedCount()==0){ 
      viewHolder.rateCount.setText("0"); 
     }else if(content.getTotalRatedCount() != 0){ 
      viewHolder.rateCount.setText(String.valueOf(Math.round(content.getTotalRatings()/content.getTotalRatedCount()))); 
     } 
    } 

    //To Set Likes 
    if (viewHolder.likeCount != null) { 
     viewHolder.likeCount.setText(String.valueOf(content.getLikes())); 
    } 

    //if viewHolder.isLiked == 0 then user not yet liked else if viewHolder.isLiked == 1 the user liked 
    //viewHolder.isLiked = content.getIsLiked(); 
    //viewHolder.currentUserRateCount = content.getCurrentUserRateCount(); 


    //Add Like Listeners 
    if (viewHolder.likeText != null && viewHolder.likeImage != null) { 

     if(content.getIsLiked() == 0){ 
      //Set liked image and text 
      viewHolder.likeText.setText("Like"); 
      viewHolder.likeImage.setImageResource(R.drawable.ic_like_grey_24dp); 
      viewHolder.likeCountImage.setImageResource(R.drawable.ic_like_grey_24dp); 
     }else{ 
      //Set liked image and text 
      //viewHolder.likeText.setText(mContext.getResources().getString(R.string.content_liked)); 
      viewHolder.likeImage.setImageResource(R.drawable.ic_like_pink_24dp); 
      viewHolder.likeCountImage.setImageResource(R.drawable.ic_like_pink_24dp); 
     } 

     viewHolder.likeText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (content.getIsLiked() == 0) { 
        content.setIsLiked(1); 


        //To insert/update user likes to local database 
        PatientRating patientRating = patientRatingDAO.getByDACodeAndType(content.getDA_Code(),content.getContent_Type()); 
        if(patientRating != null){ 
         patientRating.setIsLiked(content.getIsLiked()); 
         patientRatingDAO.update(patientRating); 
        }else{ 
         patientRating = new PatientRating(); 
         patientRating.setIsLiked(1); 
         patientRating.setContent_Type(content.getContent_Type()); 
         patientRating.setDA_Code(content.getDA_Code()); 
         patientRatingDAO.insert(patientRating); 
        } 

        //viewHolder.likeText.setText(mContext.getResources().getString(R.string.content_liked)); 
        viewHolder.likeImage.setImageResource(R.drawable.ic_like_pink_24dp); 
        viewHolder.likeCountImage.setImageResource(R.drawable.ic_like_pink_24dp); 

        //Increase like counts 
        int likes = 1 + Integer.parseInt(viewHolder.likeCount.getText().toString()); 
        viewHolder.likeCount.setText(String.valueOf(likes)); 
        viewHolder.rateBarLayout.setVisibility(View.VISIBLE); 
        Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.like_animation); 
        viewHolder.likeImage.startAnimation(animation); 
        //Toast.makeText(mContext, "Liked", Toast.LENGTH_SHORT).show(); 





    return v; 
} 

@Override 
public int getCount() { 
    return mContentsFiltered.size(); 
} 

@Override 
public Content getItem(int position) { 
    return mContentsFiltered.get(position); 
} 

public Filter getFilter(FilterOption filterOption) { 
    return getFilter(); 
} 

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      String filterString = constraint.toString().toLowerCase().trim(); 

      FilterResults results = new FilterResults(); 

      final List<Content> list = mContents; 

      int count = list.size() - 1; 
      List<Content> nlist = new ArrayList<Content>(list.size()); 

      Content filterableContent; 
      for (int i = 0; i <= count; i++) { 
       filterableContent = list.get(i); 
       if(filterableContent.getDA_Name().toLowerCase().contains(filterString)) { 
        nlist.add(filterableContent); 
       } else if (!TextUtils.isEmpty(filterableContent.getTags()) 
         && filterableContent.getTags().toLowerCase().contains(filterString)) { 
        nlist.add(filterableContent); 
       }else if (!TextUtils.isEmpty(filterableContent.getCompany_Name()) 
         && filterableContent.getCompany_Name().toLowerCase().contains(filterString)) { 
        nlist.add(filterableContent); 
       } 
      } 
      /*List<Integer> companyIds = StaticVariableUtils.getFilterOption().getFilterCompanyIds(); 
      for (int i = 0; i < count; i++) { 
       filterableContent = list.get(i); 
       if(filterableContent.getDA_Name().toLowerCase().contains(filterString)) { 
        // if company ids are selected, check if 
        // the filtered content has slected company id 
        if(companyIds != null && companyIds.size() >= 1) { 
         if(companyIds.indexOf(filterableContent.getCompany_Id()) >= 0) { 
          nlist.add(filterableContent); 
         } 
        } else { 
         nlist.add(filterableContent); 
        } 

       } 
      } 

      List<Content> tmpList = new ArrayList<>(nlist.size()); 
      if(nlist != null) { 
       // sort by datetime 
       Collections.sort(nlist, new Comparator<Content>() { 
        @Override 
        public int compare(Content lhs, Content rhs) { 
         if(StaticVariableUtils.getFilterOption().getSortingOrder() == R.string.sortingOrderLatest) { 
          return (lhs.getUploaded_Date().getTime()>rhs.getUploaded_Date().getTime() 
            ? -1 : (lhs.getUploaded_Date().getTime()==rhs.getUploaded_Date().getTime() ? 0 : 1)); 
         } else { 
          return (lhs.getUploaded_Date().getTime()<rhs.getUploaded_Date().getTime() 
            ? -1 : (lhs.getUploaded_Date().getTime()==rhs.getUploaded_Date().getTime() ? 0 : 1)); 
         } 
        } 
       }); 
      } 

      FilterOption filterOption = StaticVariableUtils.getFilterOption(); 
      if(filterOption.getShowByDate() == R.string.showByDateToday) { 
       nlist = filterByToday(nlist); 
      } else if(filterOption.getShowByDate() == R.string.showByDateLastWeek) { 
       nlist = filterByLastWeek(nlist); 
      } else if(filterOption.getShowByDate() == R.string.showByDateTwoWeeks) { 
       nlist = filterByTwoWeeks(nlist); 
      } else if(filterOption.getShowByDate() == R.string.showByDateThreeWeeks) { 
       nlist = filterByThreeWeeks(nlist); 
      } else if(filterOption.getShowByDate() == R.string.showByDateLastMonth) { 
       nlist = filterByLastMonth(nlist); 
      } else if(filterOption.getShowByDate() == R.string.showByDateOlder) { 
       nlist = filterByOlder(nlist); 
      } 

      if(filterOption.getShowByStatus() != R.string.showByStatusAll) { 
       nlist = getReadOrUnread(nlist, filterOption.getShowByStatus()); 
      }*/ 

      results.values = nlist; 
      results.count = nlist.size(); 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mContentsFiltered = (ArrayList<Content>) results.values; 
      notifyDataSetChanged(); 
     } 
    }; 
} 

meine XML-Datei

  <ListView 
      android:id="@+id/lvContent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#e2e2e2" 
      android:clipToPadding="false" 
      android:divider="@null" 
      android:dividerHeight="0dp" 
      android:fadingEdge="none" 
      android:smoothScrollbar="true" 
      android:fitsSystemWindows="true" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      android:scrollbarStyle="insideOverlay"> 

     </ListView> 

getView Methode in Adapter der Listenansicht Aufruf mehrere Zeit an Postion 0 So ist es nimmt sich mehr Zeit, um diese Aktivität zu laden. Diese Codes verwende ich .... ich weiß nicht, warum getview() mehr als einmal aufruft. Und mein Arbeitscode ist oben .. wie man dieses Problem löst.

+0

Es gibt nicht genug Informationen, um Ihre Frage zu beantworten. Bitte poste etwas mehr Code. Wie sind Sie zu dem Schluss gekommen, dass 'getView' an Position 0 mehrfach aufgerufen wird? –

+0

Nun füge ich etwas mehr Code hinzu, den ich benutze .... –

+1

gibt es absolut keine Garantie auf die Reihenfolge, in der getView() noch wie oft aufgerufen wird. http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called-multiple-times-and-in-no-co –

Antwort

0

I Resolve dieses Problem ...... Weil ich Liste von drei verschiedenen Methoden hinzugefügt und auch notifydatasetchange gesetzt. So bekomme ich die Ansicht mehr als einmal ....

Verwandte Themen