2016-08-30 2 views
0

У меня есть Gridview, и когда я нажимаю определенный элемент, я хочу нарисовать фон.Попытка выделить выделенный элемент из GridView

У меня есть адаптер для загрузки элементов gridview динамически. И у меня есть слушатель на этом адаптере. На этом слушателе я помещаю фон в цвет, который мне нужен, но затем он также рисует другой элемент в списке (я думаю, тот, который имеет ту же позицию, после перезагрузки).

Важно: мой минимальный API - 9, и я не могу его изменить.

Вот код для моего метода GetView (от адаптера):

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

    viewHolder = null; 
    if (convertView == null) { 

     viewHolder=new ViewHolder(); 

     LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view=layoutInflater.inflate(R.layout.highwayappselectionitem,parent, false); 

     viewHolder.appImageIcon=(ImageView) view.findViewById(R.id.highwayGridViewItemIcon); 
     viewHolder.appNameLabel=(TextView) view.findViewById(R.id.highwayGridViewItemName); 
     viewHolder.appInfoButton = (ImageView) view.findViewById(R.id.highwayGridViewItemInfoButton); 
     viewHolder.linearLayout = (LinearLayout) view.findViewById(R.id.HighwayGridViewItem); 

    }else{ 
     view= convertView; 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 


    viewHolder.appNameLabel.setText(appsList.get(position).getAppName()); 
    viewHolder.appImageIcon.setImageDrawable(appsList.get(position).getImageIcon()); 


    view.setTag(viewHolder); 

    viewHolder.linearLayout.setOnClickListener(new MyOnClickListener(position,0)); 

    return view; 
} 

и вот слушатель для LinearLayout (который представляет каждый элемент):

public void onClick(View v) { 

     if(selectedView==0 || selectedView==1){ 

      appName=appsList.get(position).getAppName(); 
      filePath=appsList.get(position).getFilePath(); 
      appLogo=appsList.get(position).getImageIcon(); 

      v.setBackgroundColor(activity.getResources().getColor(R.color.light_grey));   

      System.out.println("Just pressed the app ... "+appName); 
      System.out.println("His filePath is ... "+filePath); 

      HighwayGridViewAppItem tmpSelectedItem= new HighwayGridViewAppItem(appLogo, appName, filePath); 
      selectedAppsList.add(tmpSelectedItem); 

      System.out.println("AppSelectionCUstomAdapter : Added a new application to the list of selected apps .!!!!!!!!!!!!!!!........."); 
      System.out.println("AppselectioncustomAdaptaer : The size of the selectedAppsList is now : "+selectedAppsList.size()); 

     }else{ 
      //pressed the info button 
      System.out.println("This will be implemented later, need access to the webservices"); 
     } 
    } 
} 

игнорировать если (выбранный вид == 0 или == 1 он больше не используется, я могу его удалить ...).

Кроме того, appsLIst - это список моих пользовательских классов элементов. Там у меня есть логический атрибут для представления, если он выбран или нет.

Происходящее, представьте себе этот GridView:

ABC

DEF


GHI

JKL

Серая линия представляет собой свиток ... если прокрутите эти новые элементы. Если я нажимаю B, он выбирает B, но также выбирает H.

Я попытался провести исследование, но проблемы, которые я нашел, были неодинаковыми.

Что-то, что могло бы помочь .. gridview, используемый для добавления повторяющихся элементов, поэтому, когда я добавляю элементы в gridview, я проверяю, имеет ли список элементов уже подобный элемент, если так я его не добавляю.

ответ

1

Вам нужно добавить эту строку, если вы хотите сохранить выбранный элемент gridview после выбора.

((BaseAdapter) gridView.getAdapter()).notifyDataSetChanged(); 

Редактировать Я думаю, что есть проблема в методе GetView, поэтому вы получаете повторяющиеся значения:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view== null) { // if it's not recycled, initialize some attributes 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.highwayappselectionitem, parent, false); 
    } 

}

+0

Но проблема в том, что я делаю к изменениям в слушатель, который находится внутри класса адаптера (это вложенный класс), поэтому у меня нет доступа к gridview внутри там –

+0

, а затем просто используйте 'notifyDataSetChanged();' после внесения изменений. –

+0

Да, я уже поставил notifiyDataSetChanged(); но другая (основная) проблема заключается в том, что она рисует некоторые значки, которых она не должна. –

Смежные вопросы