2016-04-12 5 views
6

स्क्रॉल के दौरान मेरी छवियां बदल रही हैं पिछले हफ्ते में, मैं बस इस समस्या को हल करने का प्रयास करता हूं। हर समान प्रश्न देखें और मुझे नहीं पता क्यों, समाधान मेरे लिए काम नहीं करते हैं। मेरे पास एक सूची दृश्य है और प्रत्येक आइटम में एक छवि दृश्य है। छवि दृश्य पर क्लिक करते समय, मैं छवि संसाधन बदलना चाहता हूं। कुंआ। सब कुछ कर दिया। लेकिन स्क्रॉल करते समय, छवि संसाधन बदल जाते हैं। मेरा पूरा कोड है:सूची में एंड्रॉइड

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<String> items; 

    public CustomBaseAdapter(Context context,ArrayList<String> items){ 
     this.context = context; 
     this.items = items; 
    } 

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
} 

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

@Override 
public Object getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 

    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
     } 
    }); 
    return vi; 
} 

}

मैं कहाँ गलती है?

उत्तर

1

इस कोशिश,

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<Items> items; 

    public CustomBaseAdapter(Context context,ArrayList<Items> items){ 
     this.context = context; 
     this.items = items; 
    } 

    private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
    } 

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

@Override 
public Items getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position).getStrTxt()); 
    holder.image.setImageResource(items.get(position).getDrawableImage()); 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      items.set(position,new Items(R.drawable.fav_ic)); 
      notifyDataSetChanged(); 
     } 
    }); 
    return vi; 
} 
} 

जोड़े मॉडल कक्षा:

public class Items { 


    int drawableImage; 
    String strTxt; 


    public Items(int drawableImage) { 
    this.drawableImage = drawableImage; 
    } 
    public int getDrawableImage() { 
     return drawableImage; 
    } 

    public void setDrawableImage(int drawableImage) { 
     this.drawableImage = drawableImage; 
    } 

    public String getStrTxt() { 
     return strTxt; 
    } 

    public void setStrTxt(String strTxt) { 
     this.strTxt = strTxt; 
    } 
} 
+0

यह कोड बहुत अच्छा लगता है। लेकिन लाइन में: 'items.set (position) .setDrawableImage (R.drawable.fav_ic);' आइटम्स में बदलना चाहिए .get() –

+0

मैंने कोड संपादित किया है कृपया –

+0

धन्यवाद। आपका कोड सही में है। मेरी समस्या हल हो गई है। –

1

ऐसा इसलिए है क्योंकि जब आप सूचीदृश्य स्क्रॉल करते हैं तो एंड्रॉइड सिस्टम हमेशा नई पंक्ति बनाते हैं और गैर-दृश्य पंक्तियों को नष्ट करते हैं। आप() नीचे तो सब कुछ ठीक हो जाएगा के रूप में getView संशोधित करने की आवश्यकता:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 
if(sp.getBoolean("position="+position, false)){ 
    v.setBackgroundResource(R.drawable.fav_ic); 
} 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 

SharedPreferences.Editor edit = sp.edit(); 
edit.putBoolean("position="+position, true); 
edit.commit(); 

     } 
    }); 
    return vi; 
} 
6

आपको अपनी पृष्ठभूमि छवि या सेट विशेष पंक्ति की नहीं है कि क्या जांच करने के लिए धारक में एक बूलियन मान का उपयोग करने के लिए है।

धारक

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
boolean isSet; 
} 

सेट छवि

holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
holder.isSet = true 
     } 
    }); 

if(holder.isSet) 
{ 
holder.image.setBackgroundResource(R.drawable.fav_ic); 
} 
else{ 
holder.image.setBackgroundResource(no image or other image); 
} 

आशा है कि यह मदद मिलेगी।

1

आपको कन्स्ट्रक्टर में लेआउट इन्फ्लूटर को परिभाषित करना चाहिए क्योंकि प्रत्येक पंक्ति के लिए getView() कॉल करें ताकि अगर आप getView() में लेआउट इन्फ्लैटर को परिभाषित करते हैं तो लेआउट इन्फ्लेटर प्रत्येक पंक्ति के लिए बार-बार परिभाषित करता है।

1

हाँ, इस समस्या को ListView में हमेशा दिखाई देती है क्योंकि एंड्रॉयड हमेशा नष्ट करने और उस में पंक्तियों से तैयार करें।

आपके पास दो विकल्प:

पहले, ListView में प्रत्येक पंक्ति के लिए स्थिति को बचाने और पंक्ति प्रदर्शित करने से पहले इस स्थिति की जांच करने के लिए अपने एडाप्टर को संशोधित करें।

दूसरा एक, मैंने इसकी सिफारिश की और इसे मेरे कोड में उपयोग किया, आप RecyclerView का उपयोग कर सकते हैं, यह समस्या इसके साथ नहीं होगी।

संबंधित मुद्दे