Изменение ImageView в определенной строке в ListView с помощью специального адаптера - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь изменить ImageView в определенной строке в ListView, которая была сделана с помощью специального адаптера.

Всякий раз, когда я изменяю одну строку, другие строки также затрагиваются.Буду признателен за вашу помощь.Спасибо.Вот мой код в классе MainActivity

adapter= new CustomAdapter(dataModels,getApplicationContext());

listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(MainActivity.this, position+" ",
                    Toast.LENGTH_LONG).show();

        DataModel dataModel= dataModels.get(position);
        Snackbar.make(view, dataModel.getName()+"\n"+dataModel.getType(), Snackbar.LENGTH_LONG)
                    .setAction(" ", null).show();

        ImageView imgv = (ImageView)view.findViewById(R.id.item_info);
        imgv.setImageResource(R.drawable.fav);

        adapter.notifyDataSetChanged();

        i= Integer.parseInt(dataModel.getVersion_number());
        rotate();
        StartNewSong();

    }
});

Вот код в настраиваемом адаптере

public View getView(int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    DataModel dataModel = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view

    final View result;

    if (convertView == null) {


        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.row_item, parent, false);

        viewHolder.txtName = (TextView) convertView.findViewById(R.id.name);

        viewHolder.txtType = (TextView) convertView.findViewById(R.id.type);

        viewHolder.info = (ImageView) convertView.findViewById(R.id.item_info);

        result=convertView;

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

    Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
    result.startAnimation(animation);
    lastPosition = position;


    viewHolder.txtName.setText(dataModel.getName());
    viewHolder.txtType.setText(dataModel.getType());
    check = dataModel.getImageApp();
    if (check == "false") {

    } else if (check !="false") {
        Picasso.get()
               .load(check)
               .placeholder(R.mipmap.ic_launcher)
               .error(R.mipmap.ic_launcher)
               .into(viewHolder.info);
    }

    viewHolder.info.setOnClickListener(this);
    viewHolder.info.setTag(position);

    // Return the completed view to render on screen
    return convertView;
}

Вот проблема, которая отображается как проблема GIF , как GIF

Мой класс DataModel

открытый класс DataModel {

String name;
String type;
String id;
String imageApp;
String url;


public DataModel(String name, String type, String id, String imageApp, String url) {
    this.name=name;
    this.type=type;
    this.id=id;
    this.imageApp=imageApp;
    this.url=url;

}


public String getName() {
    return name;
}


public String getType() {
    return type;
}


public String getVersion_number() {
    return id;
}
public String getImageApp() {
    return imageApp;
}
public String getUrl() {
    return url;
 }

}

1 Ответ

0 голосов
/ 27 апреля 2019

Создайте логическую переменную с именем isSelected в своем классе DataModel и измените конструктор следующим образом.

public DataModel(String name, String type, String id, String imageApp, String url, boolean isSelected) {
    this.name=name;
    this.type=type;
    this.id=id;
    this.imageApp=imageApp;
    this.url=url;
    this.isSelected = isSelected;
}

Это будет использоваться для определения того, выбран элемент или нет. Создать геттер и сеттер для isSelected. Когда вы создаете DataModel объект, передайте isSelected как false вашему конструктору.

В вашем адаптере проверьте значение isSelected, чтобы установить соответствующее изображение.

if (dataModel.isSelected) {
    Picasso.get()
           .load(your_selected_imageview)
           .placeholder(R.mipmap.ic_launcher)
           .error(R.mipmap.ic_launcher)
           .into(viewHolder.info);
}

и в прослушивателе щелчков элемента вашего списка не измените imageview, вместо этого просто установите isSelected значение соответствующего DataModel объекта на true.

DataModel dataModel = dataModels.get(position);
dataModel.setIsSelected(true);
adapter.notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...