2015-05-08 5 views
1

Я создаю пользовательский просмотр списка с любимыми функциями, но я не знаю, как изменить фон избранного изображения на клик. Когда я просто меняю фон любимого значка, он автоматически меняет фон другого любимого фонового изображения во время прокрутки. Пожалуйста, проверьте ниже код:Динамическое изменение фона элемента настраиваемого списка

public class CustomArrayAdapter extends BaseAdapter { 
    private Activity activity; 
    private LayoutInflater inflater = null; 
    ArrayList<Customlist> list; 
    DecimalFormat formatter = new DecimalFormat("#,##,###"); 

public CustomArrayAdapter(Activity a, ArrayList<Customlist> list) { 
    activity = a; 
    inflater = (LayoutInflater) activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.list = list; 

} 

public int getCount() { 
    return list.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, 
     final ViewGroup parent) { 

    TextView txt_unit, txt_state, txt_price, term_left, customr; 
    TextView install_date; 
    final ImageView fav; 
    View view = convertView; 

    if (convertView == null) 
     view = inflater.inflate(R.layout.list_item, null); 

    customr = (TextView) view.findViewById(R.id.customr); 
    txt_state = (TextView) view.findViewById(R.id.txt_state); 
    install_date = (TextView) view.findViewById(R.id.install_date); 
    term_left = (TextView) view.findViewById(R.id.term_left); 
    txt_price = (TextView) view.findViewById(R.id.txt_price); 
    fav = (ImageView) view.findViewById(R.id.fav); 
    txt_unit = (TextView) view.findViewById(R.id.txt_unit); 

    fav.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      // fav = (ImageView)v.findViewById(R) 

      fav.setBackgroundResource(R.drawable.favourite_select); 

      Toast.makeText(activity, "click", 1).show(); 

     } 
    }); 

    // set values 
    customr.setText(list.get(position).getCUSTOMER()); 
    txt_state.setText(list.get(position).getSTATE_NAME()); 
    install_date.setText(list.get(position).getINSTALL_DATE()); 
    term_left.setText(list.get(position).getTREM_LEFT()); 
    String price = formatter.format(Integer.parseInt(list.get(position) 
      .getRUPEES())); 



    return view; 
} 
} 

ответ

0

Вы должны реализовать адаптер на ViewHolder шаблона:

http://www.vogella.com/tutorials/AndroidListView/article.html

+0

все еще получает то же problem.What я должен изменить в своем коде? Это срочно. final ViewHolder viewHolder = new ViewHolder(); \t \t if (convertView == null) { \t \t \t view = inflater.inflate (R.layout.list_item, null); } else { \t \t view = convertView; \t \t \t ((ViewHolder) view.getTag()). Fav.setTag (list.get (position)); \t \t} –

+0

см. Ответ SilentKnight. Он создал ViewHolder. Вам необходимо создать класс ViewHolder и включить в него все представления вашего настраиваемого элемента списка, а затем соответствующим образом выполнить реализацию в getView. –

+0

Я знаю, что это очень распространенная и простая проблема, но да, я создал класс ViewHolder и добавил все представления внутри класса владельца. Я не знаю, что я делаю неправильно? У меня есть попытка обновить вид списка, поэтому он будет содержать фоновый рисунок изображения той же позиции? –

1

Первый, вам нужно реализовать адаптер на ViewHolder шаблона:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ViewHoldler holder = null; 
    if (convertView == null) { 
     convertView = LayoutInflater.from(ctx).inflate(
       R.layout.frag_home_gridview_item, null, false); 
     holder = new ViewHoldler(); 
     holder.iv = (ImageView) convertView 
       .findViewById(R.id.gridview_item_label); 
     holder.tv = (TextView) convertView 
       .findViewById(R.id.gridview_item_name); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHoldler) convertView.getTag(); 
    } 
    holder.tv.setText(getItem(position)); 
    holder.iv.setImageResource(this.ids[position]); 
    return convertView; 
} 

private class ViewHoldler { 
    ImageView iv; 
    TextView tv; 
} 

Второй, используйте partial refreshment mechanism изменить цель View «ы background:

private void refreshPartially(int position){ 
    int firstVisiblePosition = listview.getFirstVisiblePosition(); 
    int lastVisiblePosition = listview.getLastVisiblePosition(); 
    if(position>=firstVisiblePosition && position<=lastVisiblePosition){ 
     View view = listview.getChildAt(position - firstVisiblePosition); 
     if(view.getTag() instanceof ViewHolder){ 
      ViewHolder vh = (ViewHolder)view.getTag(); 
      //holder.play.setBackgroundResource(resId);//Do something here. 
      ... 
     } 
    } 
} 

Третьего, добавьте AdapterView.OnItemClickListener к вашим ListView:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      refreshPartially(position); 
     } 
}); 
Смежные вопросы